Rubyベストプラクティス -プロフェッショナルによるコードとテクニック
- 作者: Gregory Brown,高橋征義,笹井崇司
- 出版社/メーカー: オライリージャパン
- 発売日: 2010/03/26
- メディア: 大型本
- 購入: 9人 クリック: 307回
- この商品を含むブログ (49件) を見る
P.223より
data = { given_name: "姉ヶ崎", surname: "寧々" } Gibberish::Simple.use_language(:ja) do p T("{given_name}{surname}", [:name, data]) #=> "姉ヶ崎寧々" end
さらっと寧々さんが出てきて吹いた。どんな和訳作業してんすかw
と、寧々さんへのツッコミだけなのもなんなので、自分用メモ。
P.36を改変+P.38
def Table(*args,&block) table = case args[0] when Hash if file = args[0].delete(:file) Ruport::Data::Table.load(file, args[0], &block) elsif string = args[0].delete(:string) Ruport::Data::Table.parse(string, args[0], &block) else Ruport::Data::Table.new(args[0],&block) end else Ruport::Data::Table.new(:data=>[], :column_names=>args, &block) end return table end
適切なコンストラクタに委譲する前に、お行儀よく、ハッシュから :file や :string オプションを削除している。
引数として渡されてきたハッシュを中で削除してるとかコワイ。と、思ってしまうのは、私が const 好きだからですかそうですか*1。
P.53の instance_eval を使うパターンと、P.71のブロックの引数にオブジェクトを渡すパターン(写経するのがめんどいのでコードは略)。自分では後者ばっかり使ってしまうので、前者があることも忘れないようにしたい。でも、instance_eval を使う場合って DSL っぽく書きたいときぐらいで、普段はオブジェクトを渡してしまった方がデメリットが無くて良いよなー。
P.105。クラスメソッドとインスタンスメソッドの両方を1つのモジュールで(コードは短めに写経)。
module MyFeatures module ClassMethods def say_hello puts "Hello!!" end end def self.included(base) base.extend(ClassMethods) end def say_hello puts "Hello!! from #{self}" end end class A include MyFeatures end A.say_hello obj = A.new obj.say_hello
へぇー。
根本的に話しが変わってしまうけど、
module MyFeatures def self.say_hello puts "Hello!!" end end
みたいな普通に書かれたクラスメソッドを引き継ぐ方法が欲しいなーと、たまに思う。A.say_hello と書かずに、MyFeatures.say_hello と書けば済む話ではあるけど、self.class.say_hello とか書きたいときがたまーにあって、うーん。class にして継承すればいいんだけども、単一継承だしなー。
P.148(コードはやっぱり短く写経)。
module A # module_function extend self def bar "This is bar" end end
module_function のかわりに extend self。この発想は無かった……。というか、そもそも module_function って自分で使った事なかった。
P.182。p の代わりに y を使うと、参照が見やすい。
irb(main):001:0> require 'yaml' => true irb(main):002:0> a = Array.new(6, []) => [[], [], [], [], [], []] irb(main):003:0> a[0] << "foo" => ["foo"] irb(main):004:0> a => [["foo"], ["foo"], ["foo"], ["foo"], ["foo"], ["foo"]] irb(main):005:0> y a --- - &id001 - foo - *id001 - *id001 - *id001 - *id001 - *id001 => nil
コレ便利ネ。
話し変わるけど、1.9 で p が引数をそのまま返すようになったけど、pp が nil のままなのは変わらないのかなー。
P.213の encode が成功するまで 1byte ずつ追加していく方法。もうちょっといい方法ないんかなーと思いつつ写経めんどいので脳内メモ。
最後。カバーのミドリガニ説明。
ミドリガニは、生息地域を広げているが、侵入していくすべての生態系にとって、有害な存在になっている。
なんでこのカニをカバーにしたんだw