define_method :hash_count do
hash = ''
hash << 'X' while hash.length < 25
hash # returns the hash from the method
end
puts hash
我在期待
XXXXXXXXXXXXXXXXXXXXXXXX
输出到屏幕。相反,我得到奇怪的随机数字,如
3280471151433993928
和
-1945829393073068570
有人可以解释一下吗? Ruby中的范围看起来比PHP / Javascript更奇怪!
答案 0 :(得分:1)
再次问好:)试试这个:
def hash_count
hash = ''
hash << 'X' while hash.length < 25
hash # returns the hash from the method
end
puts hash_count
您致电hash
,与self.hash
相同。有关hash
方法的详细信息,请参阅the documentation。注意:方法之外的hash
与方法中的hash
(字符串)不同,因为hash
(字符串)是在方法范围内定义的。
注意:您仍然可以使用define_method :hash_count do
,但是从我在此处看到的代码中,简单的def hash_count
更具可读性。
答案 1 :(得分:1)
我明白你的期望。这是一个范围问题。
变量hash
已作为函数调用存在于块的内部和外部。每当您声明一个具有相同名称的变量或函数时,您将在该范围内隐藏它 - 也就是说,使旧的无效并使用您刚刚定义的该行为的行为。
在您的情况下,您在块的范围内声明它,因此将Object#hash
函数作为do/end
块内的字符串变量隐藏。但是,变量没有在块之外被遮蔽,因此保留了原始函数调用。
所以,例如
hash = ''
define_method :hash_count do
hash << 'X' while hash.length < 25
hash # returns the hash from the method
end
puts hash
应该按预期工作,因为你在使用puts的同一范围内隐藏哈希值。出于类似的原因,如果你这样做
def hash_count
a = ''
a << 'X' while hash.length < 25
a # returns the hash from the method
end
puts a
它应该引发一个未定义的变量错误,因为它没有在此范围内定义。