1

私はプログラミングの初心者で、Ruby に関する Zed Shaw の本を完成させようとしていforますが、コードの最後のステートメントを理解できません。変数stateabbrevが定義されていない場合、ソフトウェアはそれらの値を取得する場所をどのように認識しますか?

states = {
    'Oregon' => 'OR',
    'Florida' => 'FL',
    'California' => 'CA',
    'New York' => 'NY',
    'Michigan' => 'MI'
}

cities = {
    'CA' => 'San Francisco',
    'MI' => 'Detroit',
    'FL' => 'Jacksonville'
}

for state, abbrev in states
    puts "%s state is abbreviated %s and has city %s" % [
        state, abbrev, cities[abbrev]]
end
4

2 に答える 2

1

forこれらの変数は...end反復内でのみ有効です。block などのブロック変数に似てxいます{|x| .... x ...}。値は の各要素に割り当てられます。要素のstates自然な意味がない場合は、to_aが適用されます。以下でeは、 に の要素が割り当てられますstates

for e in states
  ...
end

反復するたびに変更されます。はハッシュなのでstates、 のようなキーと値のペアの配列になります['Oregon', 'OR']

しかし、これにはもう 1 つの複雑な問題があります。それは破壊的代入と呼ばれます。割り当て時に変数とオブジェクトの数が一致しない場合、Ruby はそれらをできるだけ意味のあるものに分散しようとします。この場合、 2 つの変数である と がstateありabbrev、 のような単一の配列が割り当てられ['Oregon', 'OR']ます。Ruby はその配列を分解し、その要素を各変数に割り当てます。

state # => "Oregon"
abbrev # => "OR"
于 2014-05-01T07:28:53.453 に答える
0

この場合のfor-inコンストラクトは、statesハッシュを反復処理します。キーと値のペアごとstateに、キーにabbrev設定され、値に設定されます。したがって、最初stateは が に設定され'Oregon'abbrevが に設定され'OR'、次にstateが に設定され'Florida'abbrevが に設定され'FL'ます。これは、Ruby で機能するようにfor-構文が定義されている方法にすぎません。in

于 2014-05-01T07:26:16.023 に答える