lang
1a,b,c = [0,1] 2puts a 3puts b 4puts c
というプログラムを作って実行したら、例外は出力されずに、
nilが返ってきました。
これはなぜなのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
a,b,c = [0, 1]
は内部処理的には次のようなイメージです。
ary = [0, 1] a = ary[0] # 0 b = ary[1] # 1 c = ary[2] # nil
Ruby の配列は 「範囲外の要素にアクセスしてもエラーではなく nil
を返す」
ということを覚えておくと、例外にならないのが納得しやすいのではないかと思います。
投稿2014/09/03 02:14
総合スコア863
0
ベストアンサー
Ruby 2.1.0 リファレンスマニュアル > 演算子式 を読んでみます。
...
左辺の要素の数よりも 配列の要素の数の方が多い場合には、余った要素は無視されます。
配列の要素が足りない場合には対応する要素の無い左辺には nil が代入されます。
...
質問のケースは、
対応する要素の無い左辺には nil が代入されます。
が、適用された結果ですね。
次の記載も、注目すべき事項です。
左辺の最後の式の直前に * がついていると、対応する 左辺のない余った要素が配列として代入されます。
余った要素が 無い時には空の配列が代入されます。
このドキュメントでは例として、次コードが提示されています。
例:
lang
1foo, bar = [1, 2] # foo = 1; bar = 2 2foo, bar = 1, 2 # foo = 1; bar = 2 3foo, bar = 1 # foo = 1; bar = nil 4 5foo, bar, baz = 1, 2 # foo = 1; bar = 2; baz = nil 6foo, bar = 1, 2, 3 # foo = 1; bar = 2 7foo = 1, 2, 3 # foo = [1, 2, 3] 8*foo = 1, 2, 3 # foo = [1, 2, 3] 9foo,*bar = 1, 2, 3 # foo = 1; bar = [2, 3]
投稿2014/09/02 21:08
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
CRubyだと配列の添字がオーバーフローを起こすとnilが返ってきます
ただ、RubyといってもIRubyでは普通に例外が発生したような記憶があります
投稿2014/09/04 05:15
総合スコア11
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。