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]
!
PS 我不是在寻找解决方案(我可以只有两个不同的变量名来解决我的问题),而是我正在寻找这种行为的解释,ruby是否创建变量{ {1}}在运行时本身&由于numbers
条件,初始化为nil
答案 0 :(得分:5)
当令牌可以解释为局部变量或方法调用时,局部变量具有优先权。方法定义中的最后一个numbers
被解释为局部变量。要将其解释为方法调用,您需要明确它。
这可能是你想要的:
def get_numbers(condition)
return numbers = [3,5] if condition
numbers()
end
但这是非常臭的代码,它应该是这样的:
def get_numbers(condition)
condition ? [3,5] : numbers
end
numbers
&由于nil
条件,[和]将[初始化]初始化为if
?是。无论条件是否满足,Ruby都会解析所有内容,如果由于条件不满足而未分配局部变量,则会将其初始化为nil
。
答案 1 :(得分:3)
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
编写代码就是要获得正确答案,而且还要考虑能够在六个月或一年内返回它,而不需要花费数小时来记住你所做的事情,或者更糟糕的是,为什么要这样做。其他人继承我们的代码,因此当我们不清楚,干净,简洁地写出时,我们需要对他们在脑海中造成的破坏敏感。