好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

ラブRubyプラクティス

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック

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

*1:最近、const教なるものが流行り始めている(?)っぽいですが、それはまた別の話