在以下Ruby代码中,
#! /usr/bin/env ruby
x = true
y = x and z = y
puts "z: #{z}"
Run Code Online (Sandbox Code Playgroud)
它将z: true按预期输出.
但在下面的一个中,我希望它具有相同的行为:
#! /usr/bin/env ruby
x = true
z = y if y = x
puts "z: #{z}"
Run Code Online (Sandbox Code Playgroud)
它导致了
未定义的局部变量或方法'y'表示main:Object(NameError)
这是为什么?
我理解我正在做一个赋值,并隐式检查赋值以确定是否运行z = y.我也明白,如果我添加y的声明y = nil,就x = 5在行之后,它将按预期传递并运行.
但是,期望语言if首先评估部分然后评估其内容,并且第二块代码与第一块代码的行为相同,这是不正确的?
我有一个关于Ruby解释器如何分配变量的问题:
我经常使用这个:
return foo if (foo = bar.some_method)
Run Code Online (Sandbox Code Playgroud)
some_method返回一个对象或nil.
但是,当我尝试这个:
return foo if (true && (foo = bar.some_method))
Run Code Online (Sandbox Code Playgroud)
我得到:NameError:未定义的局部变量或方法foo for main:Object.
导致第二行出错的第一行和第二行之间的评估有何不同?