2013-01-01から1ヶ月間の記事一覧

シングルクオートをエスケープするだけの難解なお仕事

str = "hoge'fuga" puts str.gsub(/'/, "\\'") #=> hogefugafuga ???参考 http://qiita.com/items/7a1b98c0e36e7d4e33e2 http://yyuto.blogspot.jp/2009/06/ruby.html http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/14752できました。 st…

子クラスには定数も継承される

へぇと思ったのでメモ。親クラスで定義された定数は、子クラスにも継承されて修飾なしで参照できる。 クラス名も定数なので、それも出る。 class Hoge ABC = 123 class Fuga end end class Foo < Hoge p constants #=> [:ABC, :Fuga] end なんだか変な感じで…

モジュールを継承したモジュールを作りたかった話

Hogeモジュールを継承したFugaモジュールを作ろうとしたらエラーになった。 module Hoge def self.hoge # 特異メソッド puts "hoge!!!" end end module Fuga < Hoge def self.hoge # 特異メソッド puts "fuga!!!" super end end Fuga.hoge SyntaxError: (irb…

evalよりinsntance_variable_setのほうが10倍速かった話

コンストラクタで、インスタンス変数を初期化する際に引数があればそれを、なければデフォルト値を入れたかった。 class Hoge attr_accessor :foo, :bar, :baz DEFAULT = { :foo => 'foo', :bar => 'baz', :baz => 'baz', } def initialize(opt = {}) DEFAUL…

クラスインスタンス変数

メタプログラミングRubyに書いてあったことメモ。 class Hoge 〜 end の間に地の文で書かれている@の変数は「クラスインスタンス変数」と呼ばれるらしい。 class Hoge @p = 123 @@p = 234 end # クラスインスタンス変数 puts Hoge.instance_variable_get(:@p…

Proc.newとlambdaの違い

自分用まとめ。 結論 lambda使っておけば問題ない。 Kernel#procは? 1.8だとlambdaと同じ動きをする。 1.9だとProc.newと同じ動きをする。 使う必要ない。 違いその1 return lambda内でのreturnは、メソッドのdefと同じ動きをする。分かりやすい。 lambda …

Procとlambdaは[]でも呼び出せる

.callだけだと思ったら[]でも呼び出せるらしい。http://www.ruby-doc.org/core-1.9.3/Proc.html -> { puts "lambda!" }[] #=> "lambda!" Proc.new { puts "Proc!" }[] #=> "Proc!" rspec/core.rbのrequireがそうなってて、見たときびびった。

includeだけでincludeとextendする方法

読んでます。メタプログラミングRuby作者: Paolo Perrotta,角征典出版社/メーカー: KADOKAWA/アスキー・メディアワークス発売日: 2010/08/28メディア: 大型本購入: 18人 クリック: 533回この商品を含むブログ (125件) を見るその中でMerbを例に「クラス拡張…

ローカル変数をスコープ内側へ

Perlだとこれは動く。 my $outer = 123; sub hoge { print "$outer\n"; } hoge(); #=> 123 Perlは内側への変数スコープは有効だからだ。 対してRubyは動かない。 outer = 123 def hoge puts outer end hoge() #=> NameError: undefined local variable or me…