本誌からのお知らせ:WEB+DB PRESS Tech Meeting|gihyo.jp
来る2007年12月発売号(Vol.42)で,本誌は7周年を迎えることになりました。読者のみなさまへ,これまでの感謝の気持ちをこめて,本誌初のイベント企画をお届けします。
おめでとう!!ってことで今日Amazonから届いたのでさっそく投函。祈って待とう。
・・・つづき。
- RubyToken::TkIDENTIFIERまたはRubyToken::TkCONSTANTを見つけて
- nameがIDかPLURAL_IDに含まれていれば
- つぎに現れるRubyToken::TkSTRINGのvalueをmsgidとして取り出す
というのがソースからmsgidを抽出する手順だった。
それでは問題の部分はどうなっていたのか、こんなソースをパースしてみた。
def _(word); word.concat('.'); end
here_document_1 = <<EOT
In here_document_1, #{_('one')}
EOT
here_document_2 = <<'EOT'
In here_document_2, #{_('two')}
EOT
implanted_in_string_1 = "In implanted_in_string_1, #{_('three')}"
implanted_in_string_2 = 'In implanted_in_string_2, #{_("four")}'
joined_with_plus = "In joined_with_plus, " + _('five')
just_string = "In just_string, _('six')"
puts here_document_1, here_document_2,
implanted_in_string_1, implanted_in_string_2,
joined_with_plus, just_string
続きを読む…
Rubyリファレンスマニュアル – 正規表現
方法1: 戻り読みと先読みを利用する方法 (戻り読み(lookbehind)は Oniguruma *7が必要)
おぉー残念。使えたらString#scan一発だったのになーって。
Ruby-GetText-Package開発者向けドキュメント – よたらぼ 保管庫
現在、ヒアドキュメントも使うことができません。これは将来的にはサポートされるかもしれません。
結論はこうなんだけど、ググるまえにソースを読み始めてこの結論にたどり着いてしまったので使った時間を成仏させるために顛末を記す。
続きを読む…
プログラミングRubyを見直したら「クラスとオブジェクト」の章に仕組みからちゃんと説明されていた。
買った時に目を通したはずなんだけど、全然記憶に残ってない。
いま分かったってことは、きっと理解がすすんだってことなわけで、まずはめでたい。
さらに進めてみると、その説明が刺さる疑問を持ったからってことだ。
では次の理解のために、どうやってそんな疑問を持つかってことなんだけど、それはとにかく触れる時間を増やすことくらいしか思いつかない。
しっかり自分のアンテナ張って、ときにはだれかのアンテナ借りて、新しいことを覚えるのは楽しい。
[ref.] extendとincludeについて。
[ref.] extendとincludeについて。その2
この前買った「Pro Active Record」を読んでいたら、どストライクな説明を見つけてバチッときたのでその部分を翻訳して大引用。
includeされたメソッドとextendされたメソッドには微妙な違いがあります。
モジュールをクラスにincludeすると、モジュール内に定義されたメソッドはそのクラス内に定義されたものとして扱われます。
つまりモジュールをincludeすると、それらのメソッドはそのクラスのすべてのインスタンスからアクセスできます。
対して、オブジェクトにモジュールをextendすると、モジュール内に定義されているメソッドはそのオブジェクトに対してのみ有効となります。
クラスにincludeされたメソッドはそのクラスのすべてのインスタンスに、extendされたメソッドはそのオブジェクトにのみ影響します。
—– P.120 Pro Active Record (Apress, 2007) by Kevin Marshall, Chad Pytel, Jon Yurek
Rubyリファレンスマニュアルと言っていることは同じなんだけど、言い回しがきた原因なんだと思う。
で、問題の場所はプラグインの参考元から持ってきたこの部分
module ActMethods
def acts_as_fortuned
self.extend ClassMethods
self.instance_eval {include InstanceMethods}
before_save :cast
end
end
なんでClassMethodsがextendでInstanceMethodsがincludeなのかってことだった。
これはClassMethodsはクラスオブジェクトだけにしか追加したくないからextendを、InstanceMethodsはクラス定義に追加したいからincludeってことか。
「クラスオブジェクト」とその構造を表す「クラス定義」としっかり分けて考えればよかったんだ。
[ref.] extendとincludeについて。
[ref.] プラグインを作ってみた。
Riding Rails
To upgrade, `gem install rails`, set RAILS_GEM_VERSION to ‘1.2.5’ in config/environment.rb, and `rake rails:update:configs`.
こういう具体的な手順を知りたくてドキュメントを漁ったことがあるんだけど、見つからなかった。
修正内容ごとに対応方法が違ってしかりなんだと思うけど、Rails使うならここのフィードも読んでおけ、てのがお約束なんだろうか。
最初の二つは予想が付くけど、rakeのところはこのタスクの存在を知らないとやらないだろうな、と。
細かい疑問は尽きない。
IBM 境界を越える: Rails での拡張 – Japan
acts_as プラグインを解剖する
[ref.] acts_as_state_machine (記事にあるURLはすでに存在しないので)
プラグインの勉強にと、カヤックの人の記事を参考におみくじプラグインを作ってみました。
モデルにfortuneというアトリビュートがあれば、saveするときに勝手に運勢を突っ込みます。ただそれだけです。
こんな感じ。
>> boy = Person.new(:name => 'Keiichi')
>> puts boy.name, boy.fortune
Keiichi
nil
>> boy.save
>> puts boy.name, boy.fortune
Keiichi
小吉
詳細は以下の通り。
続きを読む…
Rubyリファレンスマニュアル – Object
include は、クラス(のインスタンス)に機能を追加します が、extend は、ある特定のオブジェクトだけにモジュールの機能を追加 したいときに使用します。
~コード(引用省略)~
extend の機能は、「特異クラスに対する include」 と言い替えることもできます。
うーん、分かったような気がするけど、実際に使い分けろと言われたら出来ない気がする。
つまりまだよく分かってないと言うことか。