質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

1511閲覧

Ruby 例外がでると思ったプログラムが動いた理由

goodgood

総合スコア30

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2014/09/01 03:17

lang

1a,b,c = [0,1] 2puts a 3puts b 4puts c

というプログラムを作って実行したら、例外は出力されずに、
nilが返ってきました。
これはなぜなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

yohshiy

総合スコア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

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

CRubyだと配列の添字がオーバーフローを起こすとnilが返ってきます
ただ、RubyといってもIRubyでは普通に例外が発生したような記憶があります

投稿2014/09/04 05:15

sabinekonya

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これは、多重代入において左辺の要素数が右辺より多い場合には、
余った左辺の要素にnilが代入されるからです。

それでcには、nilが代入されたのです。

投稿2014/09/02 02:30

poteto

総合スコア142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問