2
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

私はそれが2番目のケースで戻ってくることを期待してい[1,2,3,4]ます!

PS私は解決策を探していません(問題を解決するために2つの異なる変数名を持つことができます)、むしろこの動作の説明を探しています.ルビーはnumbers実行時に変数を作成しnil、条件のために初期化しifますか?

4

2 に答える 2

7

トークンがローカル変数またはメソッド呼び出しとして解釈できる場合、ローカル変数が優先されます。メソッド定義の最後numbersは、ローカル変数として解釈されます。メソッド呼び出しとして解釈するには、明確にする必要があります。

これはおそらくあなたが意図したものです:

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

しかし、これは非常に臭いコードであり、次のようにする必要があります。

def get_numbers(condition)
  condition ? [3,5] : numbers
end
  • ルビーは実行時に変数を作成[作成]し、条件のためにnumbers[そして]初期化[初期化]しますか?nilif

はい。条件が満たされているかどうかにかかわらず、Ruby はすべてを解析し、条件が満たされていないためにローカル変数が割り当てられていない場合は、 に初期化されnilます。

于 2013-07-20T09:27:08.513 に答える
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

コードを書くということは、正しい答えを得ることだけでなく、6 か月または 1 年でコードに戻ることができ、何をしたか、さらに悪いことに、なぜそれをしたかを思い出すのに何時間も費やす必要がないということでもあります。他の人が私たちのコードを継承するため、私たちが明確に、きれいに、簡潔に書かないと、彼らの心に引き起こされる可能性のある破壊に敏感である必要があります。

于 2013-07-20T14:42:06.710 に答える