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

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

ただいまの
回答率

90.35%

  • Ruby

    10222questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 3
  • VIEW 1,036

Mr_Roboto

score 2056

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

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

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

#!/usr/bin/ruby

puts "Hello Ruby"

def foo(bar:, boo:)
  puts boo
  puts bar
end

foo(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

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

#!/usr/bin/ruby

puts "Hello Ruby"

def foo(bar, boo)
  puts boo
  puts bar
end

foo("aaa", "bbb")
$ ./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です。
何か根本的に勘違いしてますでしょうか?

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

キーワード引数は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 23:30

    なるほど、デフォルト値を与えるとエラーにならないのは気づいたのですが、そういうことだったのですね。

    いつも検索して人の回答見つけてる割には自分のは見つけられないという ^_^;
    ありがとうございました。

    キャンセル

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 14:39 編集

    ご回答ありがとうございます。

    #!/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)環境でも確認してみようと思います。

    キャンセル

  • 2016/06/30 14: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のバージョンの問題ではない事だけは分かりました^^

    キャンセル

  • 2016/06/30 19: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

    キャンセル

  • 2016/06/30 23:31

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

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    10222questions

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