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

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

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

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

Q&A

1回答

764閲覧

ruby Arrayクラスのインスタンスメソッドの特殊な記法について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2021/06/14 16:28

前提

rubyのArrayクラスのインスタンスメソッドにはいくつか通常の記法とは異なる記法が利用できるメソッドがあると思います。

ruby

1array = [1,2,3] 2 3# パターンA 4array[0] #[]メソッドの場合(ドットの省略且つ引数がメソッド名の間に記述されている) 5array << 9 #<<メソッドの場合(ドットの省略が出来ている) 6 7# パターンB 8array.[](0) #[]メソッドの場合 9array.<<(9) #<<メソッドの場合

当然Rubyを触り始めた時にはパターンAの記法を先に知るわけですが、
[]が演算子や制御構文ではなくて、メソッドだと知ってから、(感覚的で恐縮なのですが)パターンAの書き方が気持ち悪く思えてきました。

質問1

Arrayクラスの[]や<<などのインスタンスメソッドがArrayクラスのインスタンスに対してパターンAの呼び方が出来るのは特別にこのメソッドはこの記法が使える様にrubyが作られているという認識で良いのでしょうか?

質問2

インタプリタ言語が(と言いますかコンパイル言語も触った事ないですしプログラミング言語が自体が)どう動いてるかは軽くググった程度で理解も薄いのですが、Rubyのコードを構文解析して(CRubyであれば)C言語が実行しているという認識でよろしいのでしょうか?
そうであればパターンAの記法は特別に構文解析のパターンに入れられているという認識で良いんでしょうか。

質問3

rubyのリポジトリを見た(=読んでない)のですが、なんとなくStringやNumericなど原始的なクラスごとにC言語で作られているのかなと感じました。
array.cみたいなファイルを見つけたのですが、これ頑張って読んだら[]の謎が解けますか?

質問4(相談気味、無視可)

自分が分からないものが今分からなくても、最低限分からない原因が分かるまではなりたいと思っています。

例えば、Dockerでの環境構築がうまくいかない時に、「これはネットワークとかIPアドレスとかの知識が足りないからググった情報を理解できないんだな」となれば、(勉強を重ねれば解決できる様になるため)その問題は解決出来なくても問題ありません。

その上で勉強するかどうかも自分でコスパを考えながら判断できます。

ただ、全く本質に迫れない様な場面に多々出くわす事があります。

僕はRailsが大好きなのですが、エラーを吐いた時になぜエラーを吐いたのか分からない時に、source_locationなどを利用してRailsを読んでみようと試みるものの関連コードの多さに挫折する事が殆どです。

特にgemを使った場合は顕著で、gem以外の(jsとかの)外部ライブラリを使った場合は更に顕著です。
例えばDeviseを使ってドキュメントに書かれていない動きを実現しようとして、エラーが解決できなかった時に、自分でゼロから作った方が早いじゃん、、、みたいな事になってしまいます。

ググって対症療法的な解決の仕方を見つけて解決できたとしてもすごくもやもやしてしまいます。

なぜ動いているのか(もしくはなぜエラーが出ているのか)を(一定の納得度でも良いので)把握できない事にすごくネガティブになってしまうのですが、例えばある分野について2-3年程度取り組んでいたら基本的にそういった事は無くなるのでしょうか?

例えばRailsにおいて(Rubyの標準クラスに安易に手を加えるべきではないという話しはおいておいて)Hashクラスに自分でインスタンスメソッドを定義したいのですが、やり方が分かりません。

ググってもやり方が出て来ず、ActiveSupportかなーと思ってディレクトリを眺めて見るも手が出せず。

今書きながら思ったんですが普通に

def Hash.custom_method
end

とかやれば良いんじゃね?とか思ったんですがそれどこでかけば良いんだ?
この定義がどこでいつ実行されるんだ?railsの各ファイルの初期化の順番とか把握しないとやばいのでは?
例えばモデルクラス内で使いたい場合ってそれより前にこの定義が実行されないとダメじゃね?

みたいな感じで疑問がどんどん湧いてきます。そして解決できません。

これに関しては試してみればいいですが、試してみて解決できたとして、
そのやり方が賢いのかの判断ができません。
できれば美しくありたいですし。

ちなみに2年ほどRailsを触っていてReactもここ半年ほど触っています。
お金をもらって開発はした事ありますが、実務経験はありません。

そもそも1人で開発を行ってると頭打ちになりやすいのでしょうか。

支離滅裂ですが最終的な質問としてはここまでを踏まえた上で、どうすればあらゆる問題を自力で本質的に解決できる様になるんでしょうか?
(もちろん完全に全てというのはないでしょうが、社会のエンジニア全体で見た時に上位の人は一定その力が強いと思うので、どうすればそれに近づけるんでしょうか?)

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

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

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

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

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

m.ts10806

2021/06/14 20:00

で、なぜ退会した
guest

回答1

0

まず誤解として、[]メソッドや<<メソッドはArrayクラス特有のメソッドでは無く、どのクラスでも使えます。String等すでに定義されているクラスもあれば、定義されてないクラスでも自分で定義すれば使えます。
演算子のメソッドは、演算子風に書くのが普通です。
1+11.+(1)と書く事は変でしょう。

なお、演算子が全てメソッドではないです。

質問1
そうです。

質問2
そうです。

質問3
上に書いたように、Arrayクラスとは関係なく、Rubyの構文解析処理の中で解析されます。
どのファイルかは調べてません。

質問4
夜中に読んでいるせいかよく分かりません。

既存クラスへのメソッドの定義は、

Ruby

1class Hash 2 def foo 3 ~~ 4 end 5end

と書けば定義されます。

投稿2021/06/14 17:09

otn

総合スコア84759

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問