2009-05-11 4 views
3

я следующееРубин новичок вопрос: хэш

class test 
hash={} 

    def printHash 
     puts hash[1] 
     puts hash[2] 
     puts hash[3] 
    end 
end 

test.new.printHash 

Печатается:

1 
0 
1 

Почему это происходит? как я могу проверить, поставил ли я что-то в этом месте хэша? или я что-то отсутствует

ответ

10

Вы также от марки, но это, кажется, делает что-то потому hash является builtin function, которая возвращает хэш Fixnum для объекта. Когда вы используете квадратные скобки на Fixnum, вы получаете value of the specific bit. Вы хотите создать переменную экземпляра, которая начинается с sigil @. Кроме того, вы должны создать переменные экземпляра в пределах метода, поэтому мы будем использовать тот, который вызывается всякий раз, когда объект класса создан, initialize:

class Test 
    def initialize 
    @hash = {} 
    end 

    def printHash 
     puts @hash[1] 
     puts @hash[2] 
     puts @hash[3] 
    end 
end 

Теперь вы найдете это печатает nil для всех трех , Чтобы проверить, имеет ли хэш значение для определенного ключа, вы можете использовать has_key?.

+0

Большое спасибо за все объяснения. пытаясь научиться рубину через проблемы Эйлера, и это немного информации, которую я бы никогда не получил от этого. Благодарю. –

+2

Это очень хорошее объяснение. Прежде чем решать проблемы Эйлера, вы можете попробовать Ruby Koans: http://github.com/edgecase/ruby_koans/tree/master –

0

В основном «хэш» выходит за рамки, то, что вы указываете в своей функции printHash, - это совсем другой объект, обычно это будет nil (новый объект, не назначенный), но поскольку Pesto указывает, что «hash» - встроенный функция - несколько путать это объяснение.

Поставив знак «@» перед вашей переменной и присвоив его методу initialize (который вызывается после «нового»), он становится доступным во всем экземпляре вашего объекта.