読者です 読者をやめる 読者になる 読者になる

gaaamiiのブログ

悪気なく間違ったことを書いている時があります。コメントやTwitter、ブコメなどでご指摘ください

キーボードを HHKB Lite2 for Mac にした

f:id:shgam:20160626164928p:plain

以下の様な理由から、HHKB Lite2 for Mac を選びました。

  • キーボードの配列を変える必要は今のところ感じてない
  • 高価なものは買いたくない
  • 小さめのキーボードがいい
  • Instagram にあげてオシャレ気取りたい

キーボード変えて何か変わりそう?

今のところ、「ちょっと気持ちよくなった」程度なので、これが思い込みなのか実際に指が喜んでいるかというのはよくわかりません。ただ、新しいものを手に入れてわくわくしている間はとても良い気分で過ごせそうです。

RubyのブロックとProcとlambdaとMethodについて

Ruby

RubyのブロックとProcとlambdaとMethodについて書きたいけど自信がないです。容赦のないマサカリやツッコミをお願い致します。

ブロック

ブロックははじめてRubyを触ったときから慣れ親しんでいるものです。

%w(:Yoshida, :Tanaka, :Suzuki).each do |name|
  puts "Hello, #{name}"
end

# または

%w(:Yoshida, :Tanaka, :Suzuki).each { |name| puts "Hello, #{name}" }

do と end というキーワード、あるいは波括弧{}で行いたい手続きを囲みます。

yield

yieldは渡されたブロックを実行します。 例として、「誰かに何かする」というメソッドを定義してみます。

def do_for(name)
  yield(name)
end

do_for(:Tanaka) { |name| puts "Hello, #{name}" }
do_for(:Suzuki) { |name| puts name.upcase }

Proc

1回きりならdoとendで囲んどきゃいいけど、その手続きを変数に入れたりして保持したいこともあります。 Procクラスのコンストラクタに同じブロックを渡せば、その処理をいつでも呼び出せるようになります。

hello_proc = Proc.new { |name| puts "Hello, #{name}" }
hello_proc.call :Nishikori
%w(:Yoshida, :Tanaka, :Suzuki).each { |name| hello_proc.call name }

lambda

「ラムダ」と発音します。Procとほぼおなじですが、違いもあるようです。ただlambda式を実行して返ってくるものはProcクラスではあります。

hello_lambda = ->(name) { puts "Hello #{name}"}
hello_lambda.call :hoge
hello_lambda.class #=> Proc

Procとの違い

「Procとほぼおなじ」というからには、何か違いがあるわけですね。コメントを頂きましたのでそれをここでも共有させていただきます。

引数チェック

# Proc は引数チェックしない
hello = Proc.new { |name| "Hello, #{name}" }
hello.call :Tanaka, :Suzuki #=> "Hello, Tanaka"

# lambda は引数チェックする
hello_lambda =  ->(name) { "Hello, #{name}" }
hello_lambda.call :Tanaka, :Suzuki #=> ArgumentError

returnの処理

[TODO: サンプルコード]

Method

自信が無いのでドキュメントそのまま引用します。

Methodとは、

Object#method によりオブジェクト化され たメソッドオブジェクトのクラスです。

メソッドの実体(名前でなく)とレシーバの組を封入します。 Proc オブジェクトと違ってコンテキストを保持しません。

とのこと。


まとめ

利用の場面を経験しないとなんとも言えない感じがするので、Ruby熟練者が書いたコードをたくさん読んでいきたいです。

なにかいろいろ物足りないのでちょこちょこ書き直します。

参考リンク

参考書籍

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

メモ

ツールはいろいろあるけれど、それが解決している問題とかアイデアに注目すると立ち向かえそうな気がしてくる。一つ一つのコマンドを覚えるとつらいけど、もっと大きい枠組みで見ていくと楽しい。技術がわかると、普通に使っているものが、どうやって実現されているのか理解することができて楽しい。ただ頭が悪いので、時間止まればいいと思ってる。

もっとも楽しいのは、普段使っているものをバラバラに砕いて理解できたとき。なので、例えば以下の様なことについて、上から順に疑問を潰せていけると楽しい。

  • プログラムを書いてから実行されるまで
  • リンクをクリックしてからページが表示されるまで
  • git clone でプロジェクトが手元にコピーされるまで
  • cd hoge でディレクトリを移動するときに起きていること

1年職場でソフトウェア開発に関わってみてわかったのは、余計なことを自ら知ろうとしないと、ツールを使う手順にばかり精通してしまって内側については何も習熟しないということ。普通に使ってるツールをいつでもバラバラに解体したり仕組みを説明できるようになりたい。