ラベル ruby の投稿を表示しています。 すべての投稿を表示
ラベル ruby の投稿を表示しています。 すべての投稿を表示

2015年1月9日金曜日

【Ruby】クラスインスタンス変数という罠

 @var は インスタンス変数、 @@var はクラス変数というのはrubyの基礎だが、 @var をクラスメソッドのスコープ内で定義した場合はクラスインスタンス変数というらしい。インスタンス変数のつもりで使うと、スコープはクラス変数にちかく予期せぬ動きになってはまる。継承したクラスからはアクセスできないので 他の言語のprivateに近いか。



# coding:utf-8

class Test

def self.set v
@var = v
end

def self.get
@var
end

end

Test.set("first desu.")
Test.set("second desu.")

p Test.get
p Test.get



実行結果


$ ruby /tmp/test.rb
"second desu."
"second desu."


 間違えやすいわりに、使いどころが不明だ。

2014年11月25日火曜日

【ruby】文字列の置換をgsubで複数条件繰り返す場合、条件をhashで指定するとどのくらい早いのか。

gsubで文字列置換をするとき、複数組の置換をする場合、メソッドチェーンでgsubをつなげて書くこともできる。
一方組みをhashで渡して1つのgsubで書くこともできる。つどはじめのstringを全部検索しない分hashで渡すほうが
はやいはずだけどどれほど違うのかと気になった。

それぞれ下記のようなコードで50万回のループをまわす。


サンプルA

# coding:utf-8

str = "aaaaabbbbbbcccccc"

500000.times do | i |
str.gsub( /aaa/, 'AAA' ).
gsub( /bbb/, 'BBB' ).
gsub( /ccc/, 'CCC' ).
gsub( /ddd/, 'DDD' ).
gsub( /eee/, 'EEE' ).
gsub( /fff/, 'FFF' ).
gsub( /ggg/, 'GGG' ).
gsub( /hhh/, 'HHH' ).
gsub( /iii/, 'III' )
end

ruby test.rb 4.07s user 0.00s system 99% cpu 4.080 total
ruby test.rb 4.05s user 0.00s system 99% cpu 4.066 total
ruby test.rb 4.11s user 0.00s system 99% cpu 4.125 total

 gsubをつなげるタイプでは4秒程度。

サンプルB

# coding:utf-8

str = "aaaaabbbbbbcccccc"

500000.times do | i |
str.gsub( /aaa|bbb|ccc|ddd|eee|fff|ggg|hhh|iii/, "aaa"=>"AAA", "bbb"=>"BBB","ccc"=>"CCC", "ddd"=>"DDD", "eee"=>"EEE",
"fff"=>"FFF", "ggg"=>"GGG", "hhh"=>"HHH", "iii"=>"III" )
end


ruby test.rb 3.64s user 0.00s system 99% cpu 3.656 total
ruby test.rb 3.59s user 0.00s system 99% cpu 3.604 total
ruby test.rb 3.63s user 0.01s system 99% cpu 3.643 total

 hashを使うタイプは4秒弱。

 まぁ50万回繰り返してこの程度だからたいていは気にならないレベル。
コーディングの早さ優先でたいていの場合はgsubの連続にするかな。