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]

附言我不是在寻找解决方案(我可以有两个不同的变量名称来解决我的问题(,而是在寻找这种行为的解释,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

编写代码就是为了得到正确的答案,但也是为了能够在六个月或一年内回到它,而不需要花几个小时试图记住你做了什么,或者更糟糕的是,你为什么这样做。其他人继承了我们的代码,所以当我们写得不清晰、干净和简洁时,我们需要对他们在他们脑海中造成的破坏保持敏感。

最新更新