ことゆうのOUTPUT

アウトプット成果物の置き場

Rubyの学習(入門書) 6,7日目(昨日/本日:3/1H。累計16.5H) 学習メモ



昨日はプログラミングの記事はお休みしていたので、2日分。
と思っていたのですが、一昨日の10章(yield、Proc)のメモのアウトプットがまだなので、本日はそれをします。

昨日の進捗:サンプルコード打ち込み(3時間)
本日の進捗:サンプルコード打ち込み(1時間)


以下に学習メモを。


P373

Procオブジェクトを実行したい場合はcallメソッドを使います。

callメソッドって、ブロックを引数として受け取ったものを実行する際も同じでしたよね。もしやこれって、ブロックがProcオブジェクトとして渡されている?
とおもってたら、すぐあとに種明かしがありました
P374

def greeting(&block)
 #(中略)
  text = block.call('こんにちは')
 #(中略)
end

引数のblockはProcオブジェクトである



P375

repeat_proc = Proc.new { |text| text *2 }
greeting(&repeat_proc)

Procオブジェクトをブロックの代わりに渡す際は&repeat_procのように、手前に&がついている点に注意してください。

なんだか、Cのポインタにおける&を連想してしまいました。関数ポインタチックですね。


P377

ラムダはProc.newよりも引数のチェックが厳密になります。

引数チェックや後述のreturn,breakの振る舞いとか見ていると、ラムダって、Procより関数型言語チックに感じます。

ところで、引数チェックが厳密といえばキーワード引数もそんな感じでしたよね。
Rubyって、このようにゆるい書き方と厳密な書き方の二種類を用意するっていうような、プログラマー目線を感じる言語というか、どんどん機能を足していっている雰囲気があるというか(実際他言語と比べてどうなんでしょう?)。
Rubyへの印象として、始めはごっちゃりとした印象を持ちましたが、要は、「いろいろな手段を用意しておくからあとは使う側に任せる」ってことなんですかね。なんかそんな雰囲気を感じます。


P378

Proc.newもラムダもどちらもProcクラスのインスタンスです。

????
同じクラスのインスタンスだというのに、振る舞いが違うってどういうこと???
継承か何かでやってるのかなと勝手に思ってたんですが、ちゃうの?
ググる。
【Ruby】ブロック・Proc・lambda を理解する - Qiita

lambdaとはProcオブジェクトを作る方法の一つで、lambdaメソッドによって作成されたProcオブジェクトはProc.newで作成されたオブジェクトといくつか異なる点を持ちます。

lambdaメソッドによって

あ、Rubyではクラスやオブジェクトは動的にいじれるんでした。あー、そういうことなのかな?。。でも自信がない。
これ以上深く突っ込むのやめとこ。後日調べたいネタではあります。


P387

column: メソッドチェーンを使ってコードを書く

先日7/6のブログにおいてProcのメソッドチェーン的なことをしたいと書きました。
でも、ブロック内やラムダのカッコ内でメソッドチェーンをすれば、見た目的に十分にすっきりなんですよね。うん、これで十分。
7/6の例においては、以下の感じ。

#前回の例
['a','b','c'].map(&:upcase).map(&:ord)

#['a','b','c'].map(&:upcase >> :ord)  ←こんな感じのやつが欲しい。。

# ↓

#(今回)以下のように書ける
['a','b','c'].map &->s{ s.upcase.ord }



P388

case文のwhen節でProcオブジェクト

これはすごい!いままでの勉強の中で一番グッときたかも。演算子(チックなもの)の再定義機能ってすげえ強力ですな。


P389

このProcオブジェクトに引数を1つ渡して実行すると、1つ目の引数をレシーバにし、そのレシーバに対して元のシンボルと同じ名前のメソッドを呼び出します。

Java8でもありましたね、似たようなの。


P390

Procオブジェクトとクロージャ
Procオブジェクト内で引数やローカル変数を参照すると、メソッドの実行が完了してもProcオブジェクトは引き続き引数やローカル変数にアクセスし続けることができます。

クロージャ、了解です。


昨日今日の勉強分のアウトプットは後日に。
というか、そんなに面白いネタはなかったので、あまり書くことないかも。