【发布时间】:2017-03-08 02:39:45
【问题描述】:
给定以下代码:
def method
words = "33"
return words
end
def callmethod
words = method
result = printout(words)
end
def printout(words)
puts (words)
end
callmethod #will print out --> "33" (words from method)
当变量words 没有被显式调用时,Ruby 如何识别它是方法调用(callmethod)的一部分?在这种情况下,我专门谈论的那一行 result = printout(words)。似乎这个函数正在拾取变量词(方法的返回值),即使我没有使用方法调用来明确地把它放进去。有人可以向我解释一下这是怎么可能的吗?
【问题讨论】:
-
words = method与words = method()相同。您正在调用名为method的方法,因此words现在将包含值33。 -
如果没有调用
method并将返回的值存储在一个名为words的新局部变量中,您认为words = method行在做什么? -
words在所有三种方法中都可用,因为您要么在本地声明和定义它,要么将其作为参数传递。words的每次使用都有效,因为您已明确使其可供使用,没有方法会“获取”另一个方法的局部变量。我仍然不确定你的困惑在哪里。words在method中显式定义,在callmethod中显式定义,并在printout中显式传递。这些变量都不是同一个变量,它们只是碰巧具有相同的名称和值。每个都是使用它的方法的本地。 -
仅供参考您的代码可以以相同的方式重写,但具有唯一的变量名称,这可能会消除您的一些困惑:gist.github.com/meagar/9b721ea5356aee05d9dd1916d03c2e83
-
@programmer321 每次 ruby 看到一个变量的名字,它都会用变量的内容替换那个名字。变量是在表达式中还是作为函数的参数并不重要。此规则的唯一例外是当您为变量赋值时。在这种情况下,变量将获得一个新值。在(几乎)所有其他情况下,Ruby 将变量的名称替换为其内容。
标签: ruby variables methods parameters arguments