Ruby实例方法&具有相同名称的条件局部变量赋值

时间:2013-07-20 09:23:52

标签: ruby

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

2 个答案:

答案 0 :(得分:5)

当令牌可以解释为局部变量或方法调用时,局部变量具有优先权。方法定义中的最后一个numbers被解释为局部变量。要将其解释为方法调用,您需要明确它。

这可能是你想要的:

def get_numbers(condition)
  return numbers = [3,5] if condition
  numbers()
end

但这是非常臭的代码,它应该是这样的:

def get_numbers(condition)
  condition ? [3,5] : numbers
end
  • ruby​​是否在运行时本身创建[create]变量numbers&由于nil条件,[和]将[初始化]初始化为if

是。无论条件是否满足,Ruby都会解析所有内容,如果由于条件不满足而未分配局部变量,则会将其初始化为nil

答案 1 :(得分:3)

@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

编写代码就是要获得正确答案,而且还要考虑能够在六个月或一年内返回它,而不需要花费数小时来记住你所做的事情,或者更糟糕的是,为什么要这样做。其他人继承我们的代码,因此当我们不清楚,干净,简洁地写出时,我们需要对他们在脑海中造成的破坏敏感。