【问题标题】:Ruby knows 'myvar' is a variable in myvar = 0 if falseRuby 知道 'myvar' 是 myvar = 0 中的一个变量,如果为 false
【发布时间】:2012-02-09 00:28:52
【问题描述】:

我正在学习 Ruby,我喜欢使用 irb 来发现新功能和技巧。今天我在玩变量和方法,因为我想知道哪个优先于另一个。一切看起来都很好,直到我尝试了这个:

def test
   puts "hello"
end

test = "bye" if false

puts test

我期待这会返回 "hello" ,但事实并非如此。所以,我想解析器将“测试”视为一个变量,而不是一个方法。我有两个问题:

  1. 我的假设正确吗?
  2. 有什么方法可以知道 something 是变量还是方法?像test.is_variable?这样的一些方法

【问题讨论】:

  • 即使没有 test = "bye" if false 行,代码也会返回 hello nil,因为 test 方法返回 puts("hello") 的结果,即 nil。跨度>
  • @GoodEnough 你是对的。我也试过没有“puts”。不过感谢您的评论:)

标签: ruby variables methods declaration


【解决方案1】:
test = "hello" if false
p test #=> nil

无论如何都会创建局部变量test(默认值nil),并且鉴于局部变量会覆盖同名的方法,这就是您得到的值。就在一个小时前someone 被主题的细微变化所困扰。你不认为这只会发生在单行条件句中吗:

if false
  test = "hello" 
end
p test #=> nil

这是因为 Ruby 在解析变量时(而不是在执行时)定义变量。

【讨论】:

  • 局部变量在解析时被定义。真的没什么。
【解决方案2】:

至少有两种方法可以提供帮助:methodslocal_variables。我不建议在现实世界的程序中使用它们,但它们在学习 Ruby 时可能很有用。

【讨论】:

  • 我不明白“至少有两种方法可以帮助”是什么意思?
  • 还有其他的,例如private_methodspublic_methodsglobal_variables 等如果您想知道“至少两个”。
  • 局部变量也算方法吗?这就是我感到惊讶的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多