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

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

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

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

487閲覧

メソッド定義はシンボルなのでしょうか?

ohtakazuki

総合スコア31

Ruby

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2017/08/29 00:42

とてもレベルの低い質問ですみません。メソッド定義はシンボルなのでしょうか?

def palindrome(s = '') if s == s.reverse puts "回文" else puts "ではない" end end

rails console で上記のようにメソッド定義を入力すると

=> :palindrome

と帰ってきます(「:」が付いているのでシンボル?)。これに対し、

# 想定内 >> :palindrome => :palindrome # 想定内 >> palindrome "しんぶんし" 回文 => nil # 想定外! >> :palindrome "しんぶんし" SyntaxError: (irb):21: syntax error, unexpected tSTRING_BEG, expecting end-of-input :palindrome "しんぶんし"

最後の「:palindrome "しんぶんし" 」ではエラーになってしまいます。
質問ですが、

  • メソッド定義で「=> :palindrome」と帰ってきますがこれは「:palindrome」というシンボルに対してメソッド定義「def ... end」が割り当てられたということを表していますか?
  • そうであれば、なぜ「:palindrome "しんぶんし"」はエラーになるのでしょうか?
  • またそうでなければ、なぜメソッド定義で「=> :palindrome」が帰って来るのでしょうか? 「=> palindrome」では無いでしょうか?

理由も含め教えて頂ければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

本当は公式のリファレンスから該当部分を探せれば良かったのですが、見つけられなかったので、実際の挙動から推測される事を回答します。

単純にメソッド定義(def メソッド名~end)の戻り値が、メソッド名と同名のシンボルであるという事ではないでしょうか。

rails consoleは実行した命令の戻り値が表示されます。
メソッド定義は、def ~ endですから、その戻り値が表示される事になります。
その値がシンボルになっているわけです。

つまり、メソッド定義はシンボルではなく、メソッド定義の戻り値がシンボルになっているだけです。
シンボルにメソッドが紐づいているわけでもありません。

これならば、シンボル名でメソッドが実行できない事の説明がつきます。

投稿2017/08/29 01:17

mingos

総合スコア4025

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

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

maisumakun

2017/08/29 01:40

もとはdefに返り値はなかったのですが、Ruby 2.1からメソッド名のシンボルを返すようになりました。 https://bugs.ruby-lang.org/issues/3753 返り値があることで、「private def メソッド名」のように定義することができるようになります。
ohtakazuki

2017/08/29 01:42

ありがとうございます。確かにおっしゃられるとおり、 ``` (def palindrome(s = '') ... end).class => Symbol ``` となり、戻り値が「Symbol」クラスであることが確認できました。ただ、シンボルにメソッドが紐付かないという点が未だ理解できていません。 例えば「"abc"」の戻り値は「"abc"」であり、これに対し「"abc".length」という操作が可能ですし、 クラスをnewした戻り値インスタンスに対して操作、というのも自然だと思います。 いっそのこと、メソッド定義の戻り値が「palindromeを定義しました」のようなメッセージならまだしっくり来るのですが。。。
maisumakun

2017/08/29 01:52

例えば、putsは文字列をコンソールに出力しますが、返り値はnilです。 「コードで行う処理の内容」と「呼んだ側に返す値」は、必ずしも一致しなければならないわけではありません。
ohtakazuki

2017/08/29 01:54

なるほど。ありがとうございます! すみません、以下がうまく理解できませんでした。メソッド定義自体には返り値が無くとも定義できるように思えます。。。 > 返り値があることで、「private def メソッド名」のように定義することができる
maisumakun

2017/08/29 01:57

Rubyの場合、privateはメソッドですが、「privateとだけ書いてモード切替を行う」のと「private :methodのようにして特定のメソッドを切り替える」という2通りの使い方があります。 「private def」でメソッドを書き始めると、defの返したシンボルがprivateの引数になって、そのメソッドだけprivateになる、という寸法です。
ohtakazuki

2017/08/29 02:08

「private :methodのようにして特定のメソッドを切り替える」 なるほど、メソッド定義の戻り値をシンボルに設計したのは、 private メソッドで、引数のシンボルに該当するメソッドをprivateにしたり、 "string".respond_to?(:length) のようなことが出来たりして便利だから、ということですね。 理解できました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問