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

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

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

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

Q&A

2回答

1762閲覧

Ruby Selfに関して

cheeeeeeese

総合スコア179

Ruby

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

1グッド

1クリップ

投稿2015/09/02 03:51

皆様、質問がございます。宜しくお願い申し上げます。

selfに関する説明

Rubyプログラムにおいて、selfとは「現在」のオブジェクトを表します。そしてRubyプログラムのどこにおいてもメッセージの受け手(レシーバ)であるオブジェクト、selfがあるとされています。

##selfに関する質問
1

このRubyプログラムにどこにおいても、selfがあるという表現が理解できていないため、簡単な事例をもとにお教え頂ければと考えます。宜しくお願い致します

2

selfがあると、つまり何がプログラマーにとって嬉しいのでしょうか??そちらもお教え頂ければ嬉しいです。宜しくお願い致します

失礼致します。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

2です。

Ruby ではないのですが、
数値を平方する処理を考えてみます。

例えば、

Smalltalk

15 square

とすると

Smalltalk

125

という答えを返すようなメソッドです。

例として ArithmeticValue オブジェクトに square を実装してみます。

Smalltalk

1square 2 ^self * self

こんな感じに書けます。

・self に * メッセージ(乗算)を送っています。乗数は self です。
・「^」は結果を返すという意味で、c言語などの return と同じです。

平方の実装の仕方はいろいろあると思いますが、
self が使えないとプログラムは書けないと思います。

先のように square メソッドを
実装すると、

Smalltalk

15 square 2(10 @ 10) square 3(3 / 4) square 40.1 square

のように ArithmeticValue を継承する
オブジェクト群(サブクラス群)は
square メッセージを受けることが
できるようになります。

レシーバは上から、
整数、点、分数、浮動点数
オブジェクトです。

Smalltalk

125 2(100 @ 100) 3(9 / 16) 40.01

と、それぞれ計算できます。

Ruby はよくわからないのですが、
self の考え方は同じだと思います。

投稿2015/09/03 00:12

umeaji

総合スコア101

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

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

0

メソッド定義の中では、selfはレシーバーを指すというのは良いですよね。メソッドの外の場合は、

Ruby

1# クラス定義の外 2p self 3p self.class 4 5class Foo 6# クラス定義の中 7 p self 8 p self.class 9end

を実行すると、

main Object Foo Class

となります。つまり、クラス定義の外ではselfは、mainというObjectクラスのオブジェクトになり、クラス定義の中では、そのクラスそのものになると言うことが分かると思います。
このように、メソッドの外でも必ずselfは何かを表しています。

質問が不明瞭ですが、(2A)レシーバーの存在そのものについての疑問なのか、(2B)レシーバーをselfという名前で表現することについての疑問なのか。

2A. レシーバー
オブジェクト指向プログラミングというのは、オブジェクトにメッセージを送ることで成り立っています。
メッセージの宛先のオブジェクトのことをレシーバーと言います。ということレシーバーの存在意義はオブジェクト指向プログラミングの存在意義と同値です。

2B. selfという名前
Rubyに於いては、暗黙のレシーバーがselfなので、多くの場合は省略できます。
レシーバーを省略するとローカル変数の参照・代入と区別が付かない場合だけ、省略不可です。
(レシーバーをメソッドのレシーバーとしてではなく引数に渡す場合は当然省略不可です)

質問の意図を外していたらコメントください。

投稿2015/09/02 10:59

otn

総合スコア84498

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問