class A
def numbers
[1,2,3,4]
end
def get_numbers(condition)
numbers = [3,5] if condition
numbers
end
end
a = A.new
a.get_numbers(true) # [3,5]
a.get_numbers(false) # nil
我希望它在第二种情况下返回[1,2,3,4]
!
附言我不是在寻找解决方案(我可以有两个不同的变量名称来解决我的问题(,而是在寻找这种行为的解释,ruby 是否在运行时本身numbers
创建变量并初始化为nil
因为if
条件?
当标记可以解释为局部变量或方法调用时,局部变量具有优先级。方法定义中的最后一个numbers
被解释为局部变量。若要将其解释为方法调用,需要使其明确。
这可能是您的意图:
def get_numbers(condition)
return numbers = [3,5] if condition
numbers()
end
但这是非常臭的代码,应该是这样的:
def get_numbers(condition)
condition ? [3,5] : numbers
end
- Ruby 是否在运行时本身创建 [创建] 变量
numbers
并 [并] 初始化 [初始化它] 以nil
因为if
条件?
是的。无论条件是否满足,Ruby 都会解析所有内容,如果因为不满足条件而未赋值局部变量,则会初始化为 nil
。
@sawa有答案,但我建议对代码进行一些不同的更改。我会从:
def get_numbers(condition)
numbers = [3,5] if condition
numbers
end
自:
def get_numbers(condition)
return [3,5] if condition
numbers()
end
我喜欢保持简单并让代码显而易见。对局部变量的赋值什么也做不了,使用不带空括号的方法名称会混淆/隐藏它是一个方法调用。
编写代码的另一种完全可以接受的方法是:
def get_numbers(condition)
if condition
return [3,5]
else
numbers()
end
end
甚至:
def get_numbers(condition)
if condition
[3,5]
else
numbers()
end
end
编写代码就是为了得到正确的答案,但也是为了能够在六个月或一年内回到它,而不需要花几个小时试图记住你做了什么,或者更糟糕的是,你为什么这样做。其他人继承了我们的代码,所以当我们写得不清晰、干净和简洁时,我们需要对他们在他们脑海中造成的破坏保持敏感。