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

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

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

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

Q&A

解決済

1回答

1029閲覧

Railsのクラスメソッドの見分け方

kokosi1062

総合スコア39

Ruby on Rails

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

1グッド

1クリップ

投稿2021/09/15 02:48

下記の問題文と答えがあったのですが、解説もなく、理由がわからないため質問させていただきます。
クラスメソッド、インスタンスメソッドの違いがわかるのですが、下記の問題文だけで
どうやって判別しているのかわかりませんでした。
調べても分からなかったので、どうやって調べるのか教えていただけますと幸いです。

・saveがクラスメソッドでない理由
・updateがクラスメソッドの理由

問題。 save where update orderの中で、クラスメソッドを全て挙げてください。 答え。 where, update, order
shinoharat👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

調べても分からなかったので、どうやって調べるのか教えていただけますと幸いです。

適当な Rails のプロジェクトを作成し、コンソールから モデル名.instance_methods および モデル名.methods を調べるのが手っ取り早いかなと思います。
Module#instance_methods - Ruby 3.0.0 リファレンスマニュアル
Object#methods - Ruby 3.0.0 リファレンスマニュアル

集合の積演算(&)を使えば絞り込みも可能です。
Array#& - Ruby 3.0.0 リファレンスマニュアル

--

■ 調べた結果

irb

1$ bundle exec rails c 2 3irb(main):001:0> User.methods & %i(save where update order) 4=> [:update, :order, :where] 5 6irb(main):002:0> User.instance_methods & %i(save where update order) 7=> [:save, :update]

--

・saveがクラスメソッドでない理由

上記の結果を見れば分かりますが、
User.methods (クラスメソッド)に save は含まれておらず、
User.instance_methods (インスタンスメソッド)に save は含まれています。

--

・updateがクラスメソッドの理由

これはちょっと悩みますね。
User.methodsUser.instance_methods の両方に update が含まれているので。

おそらく、出題者の意図としては『(インスタンスメソッドの存在を問わず)クラスメソッド(が存在するもの)を全て挙げてください。』だったのではないでしょうか。

ちなみに、クラスメソッド版の update は以下のように第一引数に ID を指定して使います。

# インスタンス生成せずに update できる # (`15` は更新対象の ID) Person.update(15, user_name: "Samuel", group: "expert")

--

下記の問題文だけでどうやって判別しているのかわかりませんでした。

メソッド名のみで判別するのは不可能なので、どれがクラスメソッドでどれがインスタンスメソッドか暗記するしかありません。

投稿2021/09/15 06:56

shinoharat

総合スコア1685

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

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

kokosi1062

2021/09/15 07:48

リファレンスマニュアル教えていただきありがとうございます。 下記について承知しました。今後似たような問題があったとき、 教えていただいたコンソールを使って、調べてまいります。大変勉強になりました。 「メソッド名のみで判別するのは不可能なので、 どれがクラスメソッドでどれがインスタンスメソッドか暗記するしかありません。」
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問