你可以在方法内部使用外部范围访问Ruby变量吗?

时间:2014-05-09 06:30:11

标签: ruby scope

我正在学习Ruby并通过编写Caesar密码来练习。到目前为止,这是我的代码:

print "Enter rotation: "
rotation = gets.chomp
print "Enter string to encrypt: "
string = gets.chomp

def encrypt
    keys = (' '..'z').to_a
    values = (' '..'z').to_a.rotate(rotation)
    hash = Hash[keys.zip(values)]
    chars = string.split('')
    encrypted_chars = chars.collect { |char| hash[char] }
    encryptd_string = encrypted_chars.join
end

puts "Encrypted string: " + encrypt

它说我无法访问rotation方法中的encrypt变量。 NameError: undefined local variable or method 'rotation' for main:Object

据我所知,rotation是一个具有外部作用域的局部变量,应该可以在encrypt方法中访问。显然这种推理有问题,有人可以解释什么是错的吗?

2 个答案:

答案 0 :(得分:3)

这是Ruby accessing outer variables in nested function的副本。

您可以通过调用@rotation将其作为包含对象的实例变量,但为什么不将stringrotation传递到encrypt方法?

答案 1 :(得分:1)

此行为的原因是局部变量存在于本地范围中,定义方法会为该方法创建新的本地范围。本地可变数据仅在当前范围内可见。

我对此感到困惑,并发现将OP的问题与嵌套方法之一联系起来只会增加混乱。但是我做了一些研究并发现了this succinct question,特别是this answer,它清楚地解释了它,并展示了一种在不创建新范围的情况下定义方法的方法。

(我只是为了别人的利益而添加这个答案,因为我在寻找答案时引出了这个问题。)