从ruby脚本输出到屏幕的奇怪值

时间:2013-05-02 14:12:16

标签: ruby

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更奇怪!

2 个答案:

答案 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

它应该引发一个未定义的变量错误,因为它没有在此范围内定义。