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

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

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

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

Ruby

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

Q&A

解決済

1回答

2996閲覧

rails の selfについて

sanezane

総合スコア91

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/07/29 04:13

Rubyを勉強しています。

当方のレベル感

仕事ではc#を扱って2カ月程、JavaSilverも取得しています。

本題

Ruby on rails5でselfというキーワードが出てくるのですが、調べてもいまいちピンときません。
調べてみた内容をまとめると

・メソッド定義のときにselfをつけることでクラスメソッドになること(つけないとインスタンスメソッドとなる?)
・メソッド内で使うと自身のインスタンスを指す。

といった感じです。

これはJavaでいうところのthisの感覚で理解を進めてしまってよいのでしょうか。

ただの愚痴

rubyは可読性が高く比較的簡単ということを書いてある記事を沢山見たのですが、私にとってはシンプル過ぎて逆に難しいです。。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

そうですね、原則としてはJavaで言うところのthisと思っていただければいいんではないかと思います。

Wikipediaの「this」を見ると、プログラミング言語の中では、thisを使う言語とselfを使う言語があるようです。RubyはObjective-CやPython(の慣習)と同じself派だった、ということですね。

メソッド定義のときにselfをつけることでクラスメソッドになること(つけないとインスタンスメソッドとなる?)

についてはちょっと特殊で、詳しく説明すると長くなるのですが(下に長い説明を書いてみました)、最初はそういう書き方のルールがある、と思っていただければよいかと思います。

おまけ: なぜクラスメソッドの定義にはselfをつけるのか・解説編

繰り返しになりますが、これは詳しい理屈は知らなくても「そういう書き方もある」と思ってもらえば大丈夫です。実用上困りません。

以下は「そうは言っても気になるので知りたい!」という人向けの説明です。

Rubyではクラスもオブジェクトである

クラスとオブジェクトは普通は別々なものなのですが、Rubyを含めた一部のオブジェクト指向プログラミング言語では、クラスもオブジェクトの一種になっています。

特に他のオブジェクト指向プログラミング言語をご存知の方には「は?」と思われるかもしれませんが、RubyではStringやHashはClassクラスのインスタンスです。

Rubyの対話環境、irbコマンドで試してみます。

console

1$ irb 2irb(main):001:0> String 3=> String 4irb(main):002:0> String.class 5=> Class

この辺はややこしい話につながるのですが(メタクラスとか)、それが気になる方には『メタプログラミングRuby第2版』という書籍がおすすめです。

Rubyでは特定のオブジェクトにだけメソッドを追加することもできる

一般的には、メソッドというのはクラス単位で定義されます。Stringのメソッドにreverseがあるとか。

ところが、RubyにはStringのうち、ある"abc"という文字列オブジェクトにだけメソッドspecialを定義する、といったことができます。

console

1$ irb 2irb(main):001:0> a = "abc" 3=> "abc" 4irb(main):002:0> def a.special 5irb(main):003:1> 100 6irb(main):004:1> end 7=> :special 8irb(main):005:0> a.special 9=> 100

違う"abc"というオブジェクトには、specialメソッドは定義されないので使えません。

(上の続き) irb(main):006:0> "abc".special Traceback (most recent call last): 2: from /Users/takahashim/.rbenv/versions/2.5.1/bin/irb:11:in `<main>' 1: from (irb):7

こういう特定のオブジェクトにだけ使えるメソッドのことを「特異メソッド(singleton method)」と呼びます。
変わったメソッドかと思われるかもしれませんが、Rubyはこうなっているのです。

クラス定義の構文中ではselfはそのクラスを指す

ちょっと特殊なselfの使われ方として、クラス定義の中でもselfは使えます。その時、selfは何を指しているかと言うと、これはそのクラスになります。

console

1$ irb 2irb(main):001:0> class Foo 3irb(main):002:1> p "self: #{self}" 4irb(main):003:1> end 5"self: Foo" 6=> "self: Foo"

これも変わってるような気もしますが、ある種の納得感はありますね。

クラスメソッドはクラスオブジェクトの特異メソッドとして定義される

ここまで来れば準備完了です。おつかれさまでした。

ひょっとすると薄々感づかれたかもしれませんが、Rubyのクラスメソッドは、クラスオブジェクトの特異メソッドとして定義されているのです。これは「クラスメソッド = クラスが持つメソッド」という意味ではある意味わかりやすい仕組みではあります。

こんな感じで、Rubyの中ではそれなりに整合性を持っていろんなしくみができているのですが、初めて使う人には分かりにくいかもしれません。
なので、最初は「そういうものだ」として使ってみて、慣れてきた時に詳しく調べてみる、くらいの方がRubyを使う上ではちょうどいいんではないかと思います(他のプログラミング言語でも同様のことはあるかもしれません。Javaでもいきなりpublic static void mainと言われても「は?」と思われるかもしれませんが、最初はあまり気にせずこう書こう、と説明するような気もします)。

以上、おまけの解説編でした。

投稿2018/07/29 04:45

編集2018/07/29 05:23
takahashim

総合スコア1877

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

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

sanezane

2018/07/29 04:49

ありがとうございます。スッキリして勉強が進められそうです。
takahashim

2018/07/29 05:24

それはよかったです。せっかくなので長い説明も追加してみましたので、よろしければどうぞ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問