owned this note
owned this note
Published
Linked with GitHub
# 【第3週】 Ruby本(超入門~チェリー本)輪読会(🅱班) \(2021\-09\-06\~ 2021\-09\-10\)
###### tags: `Ruby`
[開催概要](https://hackmd.io/P-vzcmEPQiCHAj_lLjEYJA)
[Ruby本\(超入門~チェリー本)輪読会\(🅱班\)ノートまとめ](https://hackmd.io/tioJbHqiT1uu9h0R2rlbhw)
↓超入門のサンプルコード、正誤表はこちらから
[サポートページ:ゼロからわかる Ruby 超入門:|技術評論社](https://gihyo.jp/book/2018/978-4-297-10123-7/support)
## 目次
[TOC]
## 2021\-09\-06(月)
### 参加者
- @aim2bpg シモカワ
- @haruguchi-yuma
- @Maeda8
- @napple29
- @nishitatsu
- @paru871
- @pctapitapitapi
- @Saki
### 司会
- @nishitatsu
### ドライバー
- @pctapitapitapi
### 読んだところ
超入門CHAPTER6
P152 6-3 ハッシュの要素を繰り返し処理する から
### 次回
超入門CHAPTER7
p.161 7-2 メソッドへオブジェクトを渡す から
### 各自の疑問点や気づき、学んだこと
- @aim2bpg シモカワ
- 多重代入とはこういう状態

- メソッド定義のdefとはdefine(定義する)の略。
- メソッド内の戻り値の意識が大事なことを再認識した。
- @haruguchi-yuma
- メソッドの戻り値を変数に入れるのは、メソッドの実行が思い処理だったばああい、いちいちメソッド実行せずに済むことだとわかった。あまり意識していなかった。
- ハッシュにmapメソッド呼び出した時の処理が意外だった。多重代入!
- @Maeda8
- 多重代入難しい・・・
→全然意識してなかった部分だったので、これが輪読会の凄さか〜と思いました!
- defはdefineの略
- @napple29
- ハッシュはeach_key,each_valueでキーだけ、値だけ取り出すことができる
- 配列の多重代入は要復習
- @nishitatsu
- 多重代入、tap難しい。。。
- @paru871
- `each_key` `each_value`でkeyだけ、valueだけを取り出せることをすっかり忘れていた
- メソッドは名前をつけた「処理の部品」
- メソッドを実行することを「呼び出す」という
- メソッド定義のdefとはdefineのこと
- 配列の多重代入はチェリー本では89ページ(あとで読んでみよう)
- 今日のメソッドで学んだキーワード・・・戻り値、レシーバ、tap
- @pctapitapitapi
- hash.map 配列で変数に渡される(多重代入🤯)
```ruby
{ a: 2, b: 3 }.map.with_index do |a, i|
{ key_and_value: a, index: i }
end
=> [{:key_and_value=>[:a, 2], :index=>0}, {:key_and_value=>[:b, 3], :index=>1}]
```
- るりま多重代入 https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#multiassign
- 定義する `define`
- シモカワさんありがとうございます🙇♀️
- メソッド名を実行しても戻り値を使用できるけど、メソッド内の処理が重い時はメソッドを呼び出すたびに処理が走ってしまって負担がかかるので、戻り値を変数に入れて使用すると良いみたい。
- 森塚さんが教えてくれた、イキッた書き方
```ruby
area.tap { |num| puts num }
```
- @Saki
- hashにmapを使うと多重代入になる(ここはややこしいところ)
むずかしい...!あとで読み解く
```ruby
irb(main):063:1* { a: 2, b: 3 }.map.with_index do |a, i|
irb(main):064:1* { key_and_value: a, index: i }
irb(main):065:0> end
=> [{:key_and_value=>[:a, 2], :index=>0}, {:key_and_value=>[:b, 3], :index=>1}]
irb(main):066:1* { a: 2, b: 3 }.map.with_index do |a, b, i|
irb(main):067:1* { key_and_value: a, index: i }
irb(main):068:0> end
=> [{:key_and_value=>[:a, 2], :index=>nil}, {:key_and_value=>[:b, 3], :index=>nil}]
irb(main):069:1* { a: 2, b: 3 }.map.with_index do |a, b, i|
irb(main):070:1* { key: a, value: b, index: i }
irb(main):071:0> end
=> [{:key=>[:a, 2], :value=>0, :index=>nil}, {:key=>[:b, 3], :value=>1, :index=>nil}]
irb(main):072:1* { a: 2, b: 3 }.map.with_index do |(a, b), i|
irb(main):073:1* { key: a, value: b, index: i }
irb(main):074:0> end
=> [{:key=>:a, :value=>2, :index=>0}, {:key=>:b, :value=>3, :index=>1}]
```
- 多重代入のはチェリー本にのってる!
- `control + l`でコマンドラインを一番上に!
- 複数のオブジェクトを返したいときは、 たとえば配列に入れて1つにまとめる

- メソッド`area`を変数`result`に入れると、結果を使ってさらに別の計算をしたり、いろんな用途に使えるようになる
- tapはなれると便利!

### 本日の振り返り(よかった点・次回に向けての改善点等)
- @aim2bpg シモカワ
- メソッドの戻り値の意識が大事なことを学んだのでこれからプログラム作るときには特に忘れないようにしたい。
- 内容が難しくなるにつれて、アドバイザーさんの助け舟が心強く感じています🙇🏻♂️
- にしたつさんのナイスリード、ぺろさんドライバーありがとうございました!
- @haruguchi-yuma
- 今日は意外なところから、深い話になって難しかったです。
- @Maeda8
- 輪読会初参加でした!
雰囲気とても良かったです!!
Siriみたいなやつ面白かったです笑
みなさんこれからよろしくお願いします!
- @ぺろ 前田さん輪読会参加したいって分報でおっしゃっていたので気になっていたのですが、参加できるようになってよかったです😄
- @napple29
- 戻り値、まだ理解がふんわりなのでもうちょっと進んだらたくさん質問してしまうと思います😢
- @nishitatsu
- 司会、時間を見ておくの、忘れそうになりますね😅
- @paru871
- 今日は学びが深かった!上級者になった気分です。
- 皆さんから出た質問のおかげでどんどん学びが深くなっていって素晴らしいと思った!
- にしたつさんの司会がとってもスムーズでベテランっぽくて安心して参加させていただきました。
- ぺろさんのドライバー、スムーズでよくわかりました。打鍵音がプロっぽくてかっこいい!!
- sakiさんのSiriも参加してくれてにぎやかで楽しかったー。
- 森塚さんのアドバイスと知識、本当にありがたいです。ありがとうございます!
- @pctapitapitapi
- 私のirb、インデントしてくれへんくなった。。。😓バージョンをアップデートしたら良いんかな。。。??
- 2.7以上ならインデントしてくれると思います! haruguchi
- ありがとうございます!
- SakiさんのSiriみたいなやつ、誰。。。??となった笑
- @Saki
- hashに入ってから一気に難しくなった。。mapで回し時の中の処理がよくわかってないのであよで読み解いてみます...!
- ls,wcコマンドをやってた当時、メソッドの戻り値のことをよくわかっていなかったんだな〜と痛感
- 好奇心でhashにmapを使ったら難しい話に。。。
- Siri?が突然起動してこわかった...みなさん大きい音で驚かせてしまってごめんなさい🙏
- 森塚さんありがとうございます!!
-----
## 2021\-09\-07(火)
### 参加者
- @aim2bpg シモカワ
- @haruguchi-yuma
- @Maeda8
- @napple29
- @nishitatsu
- @paru871
- @pctapitapitapi
- @Saki
### 司会
- @haruguchi-yuma
### ドライバー
- @aim2bpg シモカワ
### 読んだところ
超入門CHAPTER7
p.161 7-2 メソッドへオブジェクトを渡す から
### 次回
p.171 キーワード引数でのデフォルト値 から
### 各自の疑問点や気づき、学んだこと
- @aim2bpg シモカワ
- メソッドの戻り値がメソッドの場合、シンボルで返ってくるのが不思議だと思った。
- @haruguchi-yuma
- 困ってググったらたいてい伊藤さん!
- メソッドの中で`puts`したら戻り値が`nil`なのは気をつけたい。
- キーワード引数を定義したら、hashで呼び出せることがわかった。
- キーワード引数は何を引数にするのかを丁寧に教えてくれていて親切だなぁと思った。
- @Maeda8
- irbでメソッド名のtab補完できることを知りました。
- メソッド定義後にシンボルが返ってくるのは意識したことなかった。。
- キーワード引数使ったことないかも。シンボルとごっちゃになっている感がある。。。
→伊藤さんの記事があった
[Rubyのキーワード引数はシンボルっぽく定義するけど、シンボルそのものではない、という話 - Qiita](https://qiita.com/jnchito/items/74e0930c54df90f9704c)
- @napple29
- メソッドの引数でキーワード引数を使える(順不同でも可)ただコードが長くなる
- returnにも戻り値置くことができる
- キーワード引数のところはせっかくなのでチェリー本読んでみようと思います
- @nishitatsu
- キーワード引数は、難しく考えない!!!
目から鱗の結論でした。😄
- @paru871
- メソッドの()は省略可能
- irbの入力はtabで補完してくれる
- irbでメソッドを書いた後の戻り値がメソッド名のシンボルになる意味を調べる
- 引数を省略したときのデフォルト値、実際に目にすると迷いやすいので覚えておきたい
- @pctapitapitapi
- キーワード引数はシンボルとしても書けるよってことがwakatta
- @Saki
- メソッドの最後の実行結果が戻り値として返る
→putsは2つとも返ってくるのはなぜ?"こちらレシートになります"だけ返ってくるのかと思ってた
→putsだから戻り値自体は`nil`
- **通帳に記帳はしてるけど、お金(戻り値)は出てこないイメージ**→nishitatsuさんわかりやすい!ありがとうございます!!
- メソッド定義をirbですると、`:メソッド名`とsymbolが返ってくる→これはなんだろう?(宿題)
- デフォルト引数あんまり使ったことないけど、if式を使わずにスマートなコードがかけそう
- キーワード引数、引数が3つ以上になったらもう使ったほうが良さそう。これを指定しないとメソッドの定義コードと呼び出してるコードを見比べなきゃいけなくて読みづらそう。Rubyの課題では使わなかったけど、Sinatraで使った記憶。
- キーワード引数を定義したら、hashで呼び出せる!
- [Rubyのキーワード引数はシンボルっぽく定義するけど、シンボルそのものではない、という話 \- Qiita](https://qiita.com/jnchito/items/74e0930c54df90f9704c#202057-%E8%BF%BD%E8%A8%98%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E5%81%B4%E3%81%AF%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB%E3%81%AA%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%9C%E3%83%AB%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%E3%81%AE)
> 定義したときの引数はシンボルではない。呼び出したときの引数はシンボル。
→もし定義したときに書いたキーワード引数がシンボルなら(実際はシンボルではない)、中身のコードでキーワード引数を書くときもシンボルで書かないといけない。しかし実際はシンボルで書いていないので、「やっぱりこのキーワード引数はシンボルっぽく書けるだけであってシンボルではないんだな」と覚えることにしました
### 本日の振り返り(よかった点・次回に向けての改善点等)
- @aim2bpg シモカワ
- ドライバー2回目、楽して前のコードを流用しようとして間違えてばっかりでした〜。やっぱ、付け焼き刃はいかんですね。😅
- 難しいところなはずなのに、読んでみると意外にスッと入ってくるので超入門はやっぱりわかりやすいんだと再認識。8章クラスに入るとやばそうです。
- @haruguchi-yuma
- 徐々に難しくなってきた、シモカワさん色々試してくださってありがとうございます。
- わからないことをわからないと言える雰囲気大事ですね!
- @Maeda8
- irbでメソッド定義後にシンボルが返ってくるのは気になる!
- キーワード引数のところ、haruguchiさんやparuさんが説明してくださったけど、きちんと理解できなかった・・・🥲
- いつでも大声で「わかりませーん!」ってご遠慮無く!発言してくださーい!(PARU)
- ありがとうございます!!😄
→そもそもシンボルとかハッシュとか何が何だかわからなくなってきました。復習します!
- @napple29
- 通帳に記帳してお金が出てくる、出てこないの考え方とてもわかりやすかったです💫(pとputs)
- railsで最初から定義されているコードがわからなくて困ることが多いので、ここで基礎をしっかり身につけたいです
- キーワード引数はとりあえず普通に書きます👶🏻
- @nishitatsu
- だんだん難しくなってきたので、疑問がわいたら反射的に「分からん!!」と言いたい。
- @paru871
- 伊藤さんはいつも先回りして私達に必要な記事を書いていてくれるのが毎回本当にすごいと思う!
- キーワード引数、今取り組んでいるオブジェクト指向を身につける上で不可欠な知識なので今日のうちにもう一度読み込んでおきたい。
- @pctapitapitapi
- コンマ`,`という名前がいつも飛ぶ🤔
- これは`:`コロン
- ↑合ってます😄(paru)
- え??みんなお金と通帳の話してるけど記憶にない🤔寝てた??
- `puts`は通帳記入してお金は出てこない
- `p`は通帳記入してお金も出てくる
- メソッドとかはお金だけ出てくる
- にしたつさんありがとうございます!
- @Saki
- JavaScriptは関数(Rubyでいうメソッド)に引数を渡さない場合も()を書かないといけないので、Rubyは書きやすい~
- コードが長いと沈黙の時間が長くなってドライバーさんがプレッシャーに感じるかもなので、プレッシャーを感じにくいようにしていきたい
- 読んでるとき途中止まってしまったりボーッとして読みはじめなかったりしてすみませんでした🙏💦
- @ぺろ お気になさらず!お疲れ様ですね☺️
- @Saki ありがとうございます〜😭✨
-----
## 2021\-09\-08(水)
### 参加者
- @aim2bpg シモカワ
- @haruguchi-yuma
- @Maeda8
- @napple29 はるな
- @nishitatsu
- @paru871 パル
- @pctapitapitapi ぺろ
- @Saki
### 司会
- @Saki
### ドライバー
- @paru871
### 読んだところ
超入門CHAPTER7
p.171 キーワード引数でのデフォルト値 から
### 次回
超入門CHAPTER8
p.182 クラスを作る
### 森塚さんに教えていただいたエラーメッセージ例
```ruby=
def foo
puts bar(1)
end
def bar
puts 2
end
foo
```
エラーメッセージ
```
% ruby class5.rb
class5.rb:5:in `bar': wrong number of arguments (given 1, expected 0) (ArgumentError)
from class5.rb:2:in `foo'
from class5.rb:9:in `<main>'
```
### 各自の疑問点や気づき、学んだこと
- @aim2bpg シモカワ
- インスタンス変数だとメソッドの外から見えてしまうので使い方に注意が必要と感じた。
- 引数エラーのメッセージに引数の期待値(Default引数も考慮)が出てくるの知らなかった。😲
- メソッドの呼び出し履歴の見方もバージョンで違うので注意。
- @haruguchi-yuma
- エラーと仲良くなろうの会でした!
- Rubyのバージョン毎の仕様の変遷もざっくりとは理解しといたほうがいいんだなとわかりました。
- @Maeda8
- インスタンス変数→メソッド同士で値を渡せる
```rb
@text = "こんにちは"
def hello
p @text = "こんばんは"
end
def hello2
p @text
end
p @text #=> こんにちは
hello #=> こんばんは
hello2 #=> こんばんは
p @text #=> こんばんは
```
helloメソッドで@textに"こんばんは"が代入されている。
- `new(size = 0, val = nil) -> Array`
リファレンスマニュアルの読み方
→sizeがデフォルト引数で0になっていて、valueがデフォルト引数でnilになっている。
- @napple29
- キーワード引数もデフォルト値を設定できる
- 変数の寿命(スコープ)は、メソッドの内外で分かれる
- インスタンス変数はメソッド内外関係なく生きていられる
- @nishitatsu
- newメソッド、ArrayクラスとStringクラスは、空箱持ってくる。Integerクラスには、newメソッド無い。
- そういえば、ブロック使えば、違う数字の配列作るのに便利な時があります。`Array.new(10){[1,2,3,4,5].sample}`みたいな感じ。
- @paru871
- ローカル変数とスコープがいつも引っかかってしまい、迷路に入りがちなのでコードを書く段階からスコープの見える範囲と寿命を意識していきたい
- クラスでオブジェクトを作る際に使うnewになかなか慣れない
- integerクラスにはnewメソッドはない!
- @pctapitapitapi
- 配列の作り方`#new(size = 0, val = nil) -> Array`
- 要素の中身が違う配列は作れない
```ruby
Array.new(2, "モカ", "カフェラテ")
=> ArgumentError
```
- @Saki
- インスタンス変数をクラスの外で書いたことがなかったので、勉強になった!
- インスタンス変数だとメソッドの中で定義したのを外から呼び出せる
- ローカル変数はできない
- > (このインスタンス変数は結構特殊なインスタンス変数で main というインスタンスのインスタンス変数ですね :smiley: )
- [object main \(Ruby 3\.0\.0 リファレンスマニュアル\)](https://docs.ruby-lang.org/ja/latest/class/main.html)
- エラーの読み方
- versionによってエラーの順番表示がちがう
- [Ruby 3\.0で発生する「プロを目指す人のためのRuby入門」との差異について \- Qiita](https://qiita.com/jnchito/items/18ac338c2a4570301dd7#%E3%83%90%E3%83%83%E3%82%AF%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E3%81%AE%E8%A1%A8%E7%A4%BA%E9%A0%86%E3%81%8C%E5%85%83%E3%81%AB%E6%88%BB%E3%81%A3%E3%81%9F92111%E7%AB%A0%E6%9C%AC%E6%9B%B8%E5%85%A8%E8%88%AC)バックトレース

### 本日の振り返り(よかった点・次回に向けての改善点等)
- @aim2bpg シモカワ
- 今日も超入門からプラスアルファの知見が得られました。ありがとうございます。
- paruさんが事前にドライバー準備していただいたおかげで色々試行することができました。ありがとうございます。
- 読み手が同じ方が続いてそうなので、次回は当たりますように(!youを待ってる間のドキドキ感もあります)。
- sakiさんマイクのボリューム調整のご協力ありがとうございました。おかげで程よい音声で聴けるようになりました🙏
- @haruguchi-yuma
- 初めてlsコマンドのプラクティスをやったとき(当時はOOP)スコープが理解できずにQ&Aを投げた気がしました。
- https://bootcamp.fjord.jp/questions/353
- ↑高橋さんの解説がわかりやすくて助かりました
- @Maeda8
- haruguchiさんのスコープ講座とリファレンスマニュアルの読み方ためになりました!!ありがとうございます😄
- paruさん事前準備、ありがとうございます...!!!
- 超入門たくさん勉強する場所がある。輪読会すごい。(一人で読んでいたら気づかないところ多い)
- バックトレースのところ理解できていないので、復習しておきます!!😇😇
- @napple29
- エラーメッセージのバックトレースがwakaranかったので今後は読めそう!(今まで一番上しか読んでなかったです)
- インスタンス変数のスコープ講座とてもわかりやすかったです☺️
- まとめ無いです発言すみません、、🙏🏻
- サンプルコードいいですね!paruさんありがとうございます🎉
- ターミナルとコード一緒に表示できるようにしておきます!
- @nishitatsu
- 今日はギリギリ大丈夫な範囲でした。😅
- @paru871
- 新しい試みでドライバーをやってみましたが、今後もみんなの実力アップに役立つ方法を試行錯誤しながら柔軟にやっていけたらと思います。
- 私はそろそろもう大丈夫ではなくなってきました😅
- @pctapitapitapi
- はるぐち先生のインスタンスメソッド講座めっちゃわかりやすかった!ありがてぇ〜🙏(前田さんのコメント参照)
- パルさんが今日輪読する予定のコードを事前にファイルで用意してくださっていてめちゃくちゃスムーズに輪読会が進んだ。。。感謝すぎる。。。!!🙇♀️
- 今日も森塚さんの神アドバイスありがとうございます!(パルさんのコメント参照)
- どこから分からなくなるか怖い😇震えながら読んでる
- @Saki
- スコープすぐわからなくなるので、書くたびに調べている...
- @paru さん事前に準備してくださってとても助かります...ありがとうございます🙏事前にサンプルコードを用意しておくのいいですね!
- 森塚さんのエラーの読み方講座とてもわかりやすかったです!ありがとうございます。バックトレースよくわからなくて一番上しか読んでなかったのでちゃんと読もうと思います!
-----
## 2021\-09\-09(木)
### 参加者
- @aim2bpg シモカワ
- @haruguchi-yuma
- @Maeda8
- @napple29 はるな
- @nishitatsu
- @paru871 パル
- @pctapitapitapi ぺろ
- @Saki
### 司会
- @Maeda8
### ドライバー
- @haruguchi-yuma
(途中交代)
- @paru871 パル
### 読んだところ
超入門CHAPTER8
p.182 8-2 クラスを作る から
### 次回
p.190 8-3 クラスに引数を受け取るメソッドを定義する から
### 森塚さん講義
```ruby=
class Drink
def name
"カフェラテ"
end
end
drink = Drink.new
p drink.method(:tap)
```
```
8-3 % ruby drink_methods.rb
#<Method: Drink(Kernel)#tap() <internal:kernel>:89>
```
-----
```ruby=
class Drink
def name
"カフェラテ"
end
end
drink = Drink.new
p drink.method(:name).source_location
```
```
8-3 % ruby drink_methods.rb
["drink_methods.rb", 2]
```
-----
```ruby=
class Drink
def name
"カフェラテ"
end
end
drink = Drink.new
p drink.method(:name)
```
```
8-3 % ruby drink_methods.rb
#<Method: Drink#name() drink_methods.rb:2>
```
-----
```ruby=
class Drink
def name
"カフェラテ"
end
end
drink = Drink.new
p drink.method(:name).owner
```
```
8-3 % ruby drink_methods.rb
Drink
```
-----
```ruby=
class Drink
def name
"カフェラテ"
end
end
drink = Drink.new
p drink.method(:name).receiver
```
```
8-3 % ruby drink_methods.rb
#<Drink:0x00007f87bd866090>
```
-----
```ruby=
class Drink
def name(a, b = 1, c:2)
"カフェラテ"
end
end
drink = Drink.new
p drink.method(:name).parameters
```
```
8-3 % ruby drink_methods.rb
[[:req, :a], [:opt, :b], [:key, :c]]
```
-----
```ruby=
class Drink
def name(a, b = 1)
"カフェラテ"
end
end
drink = Drink.new
p drink.method(:name).parameters
```
```
8-3 % ruby drink_methods.rb
[[:req, :a], [:opt, :b]]
```
-----
```ruby=
class Drink
def name(a, b = 1, c:)
"カフェラテ"
end
end
drink = Drink.new
p drink.method(:name).parameters
```
```
8-3 % ruby drink_methods.rb
[[:req, :a], [:opt, :b], [:keyreq, :c]]
```
-----
```ruby=
class Drink
def name
"カフェラテ"
end
end
drink = Drink.new
p drink.method(:name).parameters
p drink.name
```
```
8-3 % ruby drink_methods.rb
[]
"カフェラテ"
```
-----
### 各自の疑問点や気づき、学んだこと
- @aim2bpg シモカワ
- methodメソッドで色々な情報を取得できることを知った。メソッドなし、owners、receiver、parameters
[class Method \(Ruby 3\.0\.0 リファレンスマニュアル\)](https://docs.ruby-lang.org/ja/3.0.0/class/Method.html#I_PARAMETERS)

- メソッド実行後の戻り値の型を意識付けること。
- @haruguchi-yuma
- メソッドというメソッドがあるのを初めて知った。
- クラスにはメソッドを定義できる。methosで定義したメソッド一覧が得られる。
- 自分のクラスで定義していないけど、一覧に乗ってる定義はどっかで定義されている。
- @Maeda8
```rb
class Drink
def name
"カフェラテ"
end
end
drink = Drink.new
p drink.method(:name).parameters.class #=> Array
p drink.method(:name).class #=> Method
p drink.name.class #=> String
p drink.class #=> Drink
```
→戻り値によって型が変わる。
- @napple29 はるな
- ` .source_location`でメソッド定義の位置を知ることができる
- `.owner`
- 戻り値のデータ型が本当に大事
- @nishitatsu
- `.owner`,`.source_location`,`.parameters`ありがとうございます。メモっときます!!!
- @paru871 パル
- クラスと定数はキャメルケース、変数はスネークケース
- メソッドの戻り値の型が何になるのかを常に意識すること
- @pctapitapitapi ぺろ
- クラス.newで作ったのはガレージみたいな感じで、@nameとかが車みたいに働く入れ物
- というにしたつさんの説明から得たイメージ
- @Saki
- クラスの挙動はわかってきたけれど、いざ自分で書こうとすると難しい😇
- classクラス...混乱する。classを自分で定義したら`class`クラス。定義した瞬間から、Moduleから継承した[class Class \(Ruby 3\.0\.0 リファレンスマニュアル\)](https://docs.ruby-lang.org/ja/latest/class/Class.html)にのってるメソッドが使えるようになっている。
- 森塚さんに教えていただいた便利メソッド!
- `drink.method(:name).source_location`で、nameメソッドを定義した場所がわかる!(drinkはDrinkクラスのインスタンス)
- `drink.method(:name).owner`でdrinkが度のクラスで定義されたかわかる
- `drink.method(:name).receiver`でレシーバの中身がわかる
- methodオブジェクト聞き慣れない...[class Method \(Ruby 3\.0\.0 リファレンスマニュアル\)](https://docs.ruby-lang.org/ja/3.0.0/class/Method.html#I_PARAMETERS)
- **メソッドを読んだらどんな型が返ってくるかに注目すべし。戻り値の型によって属するクラスも変わる=使えるメソッドも変わってくる**
- `drink`の戻り値は`Drink`クラス
- `drink.method(:name)`の戻り値は`Method`クラス
- `d`rink.method(:name).parameters`の戻り値は`[]`なのでArrayクラス
- →メソッドをどんどん使っていくと誰が何を呼び出してるかわからなくなるので、1個1個レシーバとメソッドを確認しながら書こうと思った!
### 本日の振り返り(よかった点・次回に向けての改善点等)
- @aim2bpg シモカワ
- 今、ちょうど自作lsコマンドでクラスを扱っているのでリアルタイムな話題で理解が深まっている気がする。教科書にない話も点と点がつながる感じがしている。
- maedaさん、初司会おつかれさまでしたー
- @haruguchi-yuma
- 途中動かなくなってすみませんでした、、、
- 大丈夫です!戻ってきてくださってよかったー😄いつでもカバーします!ヘッポコですけど😅(paru)
- @Maeda8
- 戻り値によって型が変わるというのを意識したのは初めてでした。
- 司会初めてでした!もっと上手く出来るように皆さんの司会を見ながら学んでいこうと思います!
- @皆さん 司会ありがとうございましたという言葉、ありがとうございます🙇♂️
- @napple29 はるな
- Maedaさん司会ありがとうございました!
- 今まで全く使いこなせてなかったですが、クラスを作ってメソッド定義して呼び出すところまではできそうです
- 私はこの後のinitializeメソッドがわからないので教えていただきたいです😇
- @nishitatsu
- ついにクラスの難しいところに来てしまった。分かったような気になって、使えないことが多いので、皆さんよろしくお願いします。😅
- @paru871 パル
- 難しくなってきましたが、わからないところはしっかり質問して理解しながら進んでいきたいと思いました。
- 森塚さんの講義は本当にありがたいです。ドライバーの私が経験不足で本当に申し訳ないです🙏
- まえださんの司会、とってもスムーズでリーダーシップが感じられて安心しました。
- にしたつさんの例え話はいつもわかりやすい!イメージしやすい!
- @pctapitapitapi ぺろ
- ちょっと難しくなってフリーズした😇難しいと思考停止しがちで質問も出てこないから悲しい
- 前田さん初司会ありがとうございます!関西弁が親しみやすくて良い☺️
- 今日の森塚さん講座もありがたかった🙏
- @Saki
- シモカワさんお気遣いくださってありがとうございました!
- 🙏とんでもないです〜 シモカワ
- Maedaさん初の司会ありがとうございました!
- 森塚さん、いつも課題の本には載ってない知見を教えてくださってありがとうございます!
-----
## 2021\-09\-10(金)
### 参加者
- @aim2bpg シモカワ
- @haruguchi-yuma
- @Maeda8
- @napple29 はるな
- @nishitatsu
- @paru871 パル
- @pctapitapitapi ぺろ
- @Saki
### 司会
- @nishitatsu
### ドライバー
- @napple29 はるな
### 読んだところ
超入門CHAPTER8
p.190 8-3 クラスに引数を受け取るメソッドを定義する から
### 次回
超入門CHAPTER8
p.195 8-4 インスタンス変数はオブジェクトごとに存在する から
### 各自の疑問点や気づき、学んだこと
- @aim2bpg シモカワ
- lsコマンドを作るでself使ってみてるが、p selfでレシーバが調べられることは知らなかった。selfの使い所がわからない時に今度使ってみようと思った。
- メソッドの分け方は一つ一つの仕事をきちんと果たせるくらいの粒度で分ける。
- インスタンス変数は多用する設計が破綻するということを改めて再認識させていただいた。
- [改訂版・(あなたの周りでも見かけるかもしれない)インスタンス変数の間違った使い方 \- Qiita](https://qiita.com/jnchito/items/4d62693525f5023013cc)
- @haruguchi-yuma
- selfは呼び出す場所によって違う。
- クラスのメソッドの中だと、呼び出したインスタンス(レシーバ)自身
- 変わりにくいデータはインスタンス変数にしてもいい。
- コロコロ変わるデータはメソッドで渡していった方が危険が少ない
- @Maeda8
- 下のコードではselfはDrinkクラスのオブジェクトを表す。
```rb
class Drink
def name
"モカ" + topping
end
def topping
"エスプレッソショット"
end
end
drink = Drink.new
puts drink.name #=> モカエスプレッソショット
```
```rb
class Drink
def name
"モカ" + self.topping
end
def topping
"エスプレッソショット"
end
end
drink = Drink.new
puts drink.name #=> モカエスプレッソショット
```
- インスタンス変数を使う場合と使わない(ローカル変数だけ)場合
```rb
class Drink
def order(item)
puts "#{item}をください"
@name = item
end
def reorder
puts "#{@name}をもう1杯ください"
end
end
drink = Drink.new
drink.order("カフェラテ")
drink.reorder
#=> カフェラテをください
#=> カフェラテをもう1杯ください
```
```rb
class Drink
def order(item)
puts "#{item}をください"
name = item
reorder(name)
end
def reorder(name)
puts "#{name}をもう1杯ください"
end
end
drink = Drink.new
drink.order("カフェラテ")
#=> カフェラテをください
#=> カフェラテをもう1杯ください
```
- @napple29 はるな
- メソッド名と関係ない動きをするような定義をしてはいけない
- クラス内でメソッドを呼び出すときはレシーバを省略できる
- @nishitatsu
- IDと識別番号は違う。
- 単一責任の原則。覚えました!!!ありがとうございます!!!
- @paru871 パル
- ローカル変数より広いスコープを持つ「インスタンス変数」
- インスタンス変数の寿命・・・それを持つオブジェクトの寿命と同じになる
- ガベージコレクション・・・役目が終わったら寿命終わり・・・調べてみる
- 依存性をなくすことが大切
- メソッドの分け方の粒度は、メソッド名とメソッド内の処理が合っているかどうか
- @pctapitapitapi ぺろ
- メソッド同士依存し過ぎては良くない。メソッドの中で引数付きでメソッド呼び出して次のメソッドを実行して...みたいなことが続くのは良くない。それならインスタンス変数使うとか、デフォルト引数を設定するとかしよう。
```ruby
# デフォルト引数設定
def order(item, require_order: false)
```
- @Saki
### 本日の振り返り(よかった点・次回に向けての改善点等)
- @aim2bpg シモカワ
- クラスの章に入ってだんだん難しくなってきた。超入門に書いてある内容は理解できるが、なぜそうなるのかを深堀りしていくとまだまだわからないことが多いと感じた。その辺はチェリー本の輪読会で理解を深めていきたい。
- 今週もおつかれさまでした〜。来週も難しいところ続きますが、皆さんで乗り越えていきましょう💪
- @haruguchi-yuma
- クラス定義中のメソッドの中でメソッドを呼ぶと変数なのかメソッドなのかわからなくなって読めない!みたいなことがありました。
- 一週間があっという間でした。来週も引き続きクラスなので頑張っていきたい!
- @Maeda8
- self恐怖症なので、少しselfのことをしれて良かった。使えるようになりたいです。
- データの内容が不変のものはインスタンス変数に入れて良いということを学べた。
- だんだん難しくなってきた🥲
- ペロさんの質問のおかげで色々勉強できています、ありがとうございます!!
- @ぺろ こちらこそ!お付き合い頂きありがとうございます🙇♀️
- @napple29 はるな
- インスタンス変数使いこなしたい…
- 優しくドライバーをサポートしてくださりありがとうございます👶🏻
- 超スムーズ!画面もきれいでみやすかったです。ありがとうございました(paru)
- @nishitatsu
- そろそろ`name`が出始めたので、要注意!
- 日曜にワクチン接種2回目なので、来週頭出れないかも、、、
- お大事に!
- 無理せずにゆっくり過ごしてくださいねー!
- @paru871 パル
- インスタンス変数を上手に使えるようになりたい!
- self少しわかるようになった。
- 伊藤さんのインスタンス変数の記事を再度読んで理解を深めておきたいと思います。
- ぺろさんのプログラム読みくだしがとてもわかりやすく、勉強になってありがたいです。
- そう言っていただけると助かります😂ありがとうございます!
- @pctapitapitapi ぺろ
- 質問し放題でめちゃくちゃありがたい🙇♀️
- 今lsコマンドで悩んでいる所に使えないかどうか、めちゃくちゃ考えながら輪読会参加してる😇
- @Saki
- Drink.newで作られたオブジェクトがインスタンス変数@nameの持ち主で、このオブジェクトが存在する間は@nameも存在して使える→これがガベージコレクションか!
- haruguchiさんのインスタンス変数を使わない場合のreorderメソッドの例がわかりやすかったです!

→これが依存性が強い状態なのか。なるほど。
- メソッドは原則、単一責任
- かといってなんでもインスタンス変数に突っ込むのも良くない→[改訂版・(あなたの周りでも見かけるかもしれない)インスタンス変数の間違った使い方 \- Qiita](https://qiita.com/jnchito/items/4d62693525f5023013cc)