【问题标题】:In Ruby, how do variables get passed into arguments without a method call?在 Ruby 中,如何在没有方法调用的情况下将变量传递给参数?
【发布时间】: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 = methodwords = method() 相同。您正在调用名为method 的方法,因此words 现在将包含值33
  • 如果没有调用method 并将返回的值存储在一个名为words 的新局部变量中,您认为words = method 行在做什么?
  • words 在所有三种方法中都可用,因为您要么在本地声明和定义它,要么将其作为参数传递。 words 的每次使用都有效,因为您已明确使其可供使用,没有方法会“获取”另一个方法的局部变量。我仍然不确定你的困惑在哪里。 wordsmethod 中显式定义,在callmethod 中显式定义,并在printout 中显式传递。这些变量都不是同一个变量,它们只是碰巧具有相同的名称和值。每个都是使用它的方法的本地。
  • 仅供参考您的代码可以以相同的方式重写,但具有唯一的变量名称,这可能会消除您的一些困惑:gist.github.com/meagar/9b721ea5356aee05d9dd1916d03c2e83
  • @programmer321 每次 ruby​​ 看到一个变量的名字,它都会用变量的内容替换那个名字。变量是在表达式中还是作为函数的参数并不重要。此规则的唯一例外是当您为变量赋值时。在这种情况下,变量将获得一个新值。在(几乎)所有其他情况下,Ruby 将变量的名称替换为其内容。

标签: ruby variables methods parameters arguments


【解决方案1】:

callmethod方法内words是一个局部变量,其值为方法method的返回值。

printout(words) 按预期工作,因为您向其传递了一个局部变量 words 的值,即字符串 "33"

在 Ruby 中,method_name() 在调用方法时是可选的。如果你碰巧有一个同名的局部变量作为方法,为了让 Ruby 知道你想调用一个方法,而不是获取局部变量的值,你可以说method_name()。但是有一个更好/推荐的选项 - self.method_name

【讨论】:

  • 虽然你可以添加大括号,但实际上你几乎从不这样做:self.x 是大多数风格指南推荐的,而不是x()
  • 你能举个例子吗,也许使用前面的例子来说明如何用 self.x 重写它?
  • @programmer321 在这种情况下它没有多大意义,因为它是不必要的,但下一个相当于你所拥有的:def callmethod words = self.method result = self.printout(words) end
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2021-04-23
相关资源
最近更新 更多