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

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

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

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

Q&A

解決済

2回答

1986閲覧

Rubyのキーワード引数について教えて下さい。

Mr_Roboto

総合スコア2208

Ruby

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

1グッド

3クリップ

投稿2016/06/30 04:58

質問力アップキャンペーンを個人的に開始したBJCRobotです、よろしくお願い致します。

Rubyに関しては、ほぼ初心者レベルです。
技術評論社のRuby徹底攻略というムックで学習しています。

で、キーワード引数は、引数名の後ろに 「:」コロン(もちろん半角です)を
付けるということだと理解したのですが、実際に書いてみるとエラーになってしまいます。

Ruby

1#!/usr/bin/ruby 2 3puts "Hello Ruby" 4 5def foo(bar:, boo:) 6 puts boo 7 puts bar 8end 9 10foo(boo: "aaa", bar: "bbb")

実行するとエラーになります。

$ ./hello_20160630.rb ./hello_20160630.rb:5: syntax error, unexpected ',' def foo(bar:, boo:) ^ ./hello_20160630.rb:8: syntax error, unexpected keyword_end, expecting end-of-input

キーワード引数で無い書き方であれば、動きます。

Ruby

1#!/usr/bin/ruby 2 3puts "Hello Ruby" 4 5def foo(bar, boo) 6 puts boo 7 puts bar 8end 9 10foo("aaa", "bbb") 11
$ ./hello_20160630.rb Hello Ruby bbb aaa

検索で見つけた以下のページによると
Rubyテクニック: Rubyの通常の引数とキーワード引数の違い
キーワード引数が使えるようになったのは、Ruby2.0からとのことなので、確認してみると

$ ruby -v ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]

大丈夫そうです。

環境は、Mac OS X El Capitanです。
何か根本的に勘違いしてますでしょうか?

他になにか確認することがあれば、ご教授いただけましたら幸いです。

よろしくお願い致します。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

キーワード引数は2.0.0からの機能ですが、キーワード引数のデフォルト値を省略できるようになったのは、2.1.0からです。2.0.0でキーワード引数のデフォルト値を省略した場合、文法エラーになります。

参考: https://github.com/ruby/ruby/blob/v2_1_0/NEWS より(超意訳付き)

  • Now the default values of keyword arguments can be omitted. Those
    "required keyword arguments" need giving explicitly at the call time.
  • (2.1.0になって)今やっと、キーワード引数のデフォルト値を省略できるようになったよ。
    そんな感じで「求められたキーワード引数」に対しては呼び出しに明示して引数を与える
    必要があるからね。

上記の通り、OS X デフォルトの2.0.0ではデフォルト値がない書き方に対応していません。デフォルト値を与えるか、homebrewやrbenv等で2.1.0以上をインストールして、試してみてください。

投稿2016/06/30 10:03

編集2016/06/30 10:07
raccy

総合スコア21733

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

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

Mr_Roboto

2016/06/30 14:30

なるほど、デフォルト値を与えるとエラーにならないのは気づいたのですが、そういうことだったのですね。 いつも検索して人の回答見つけてる割には自分のは見つけられないという ^_^; ありがとうございました。
guest

0

掲載されたコードの内容については問題ありません。
となると、可能性としては実行しているrubyが異なるくらいでしょうか。

hello_20160630.rbの1行目に

#!/usr/bin/ruby

と書かれているので、このファイルは/usr/bin/rubyで実行するという意味になります。
一方、

$ ruby -v

では、現在の環境変数に設定されているrubyが実行されてバージョン表示をしています。

$ /usr/bin/ruby -v

を実行した時に、バージョン表示はどうなるでしょうか?
この表示が2.0.0より古いバージョンならば、この推測通りのはずなので、

$ which ruby

を実行すると現在のrubyのパスが分かりますので、
hello_20160630.rbの1行目に書くパスを変更すれば解決します。

もし、/usr/bin/rubyが2.0.0であるとすれば、エラーは出ないはずなので原因が思いつきません。
まずは、上記のバージョン確認をしてみてはどうでしょうか?

投稿2016/06/30 05:26

mingos

総合スコア4025

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

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

Mr_Roboto

2016/06/30 05:45 編集

ご回答ありがとうございます。 #!/usr/bin/ruby に関しては、 $ which ruby で書いたものなので間違いないと思います。 念のため、バージョン確認してみると同じもののようです。 $ ruby -v ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15] $ /usr/bin/ruby -v ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15] よくわからないのでMac以外の(Linux)環境でも確認してみようと思います。
mingos

2016/06/30 05:58

Macは持っていないので、 CentOSに2.0.0p648をインストールして試してみましたが、問題なく実行できました。 test.rb ```ruby puts "Hello Ruby" def foo(bar, boo) puts boo puts bar end foo("aaa", "bbb") ``` 実行結果 ``` $ ruby -v ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-linux] $ ruby ./test.rb Hello Ruby bbb aaa ``` お使いのMacで動かない理由は分かりませんが、rubyのバージョンの問題ではない事だけは分かりました^^
shanxia

2016/06/30 10:02

私のMacでは成功しました。 $ which ruby /usr/bin/ruby $ ruby -v ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15] $ ./w.rb Hello Ruby aaa bbb
Mr_Roboto

2016/06/30 14:31

無事解決しました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問