« Arduinoコンテスト2008
» OSXでGoogle App Engineをはじめる

Article (記事)

あなたのコードに使うべき21のRubyトリック

06.03.08 | Comment?

rubyinside.comに 21 Ruby Tricks You Should Be Using In Your Own Codeという記事が掲載されていました。

よりRubyコードをシンプルに読みやすくするために覚えておいて損はないですね。

勉強になりましたので抄訳しました。

1 – 正規表現にマッチした文字を抜き出す簡単な方法

文字列から正規表現にマッチした文字を抜き出す場合、通常はmatchもソッドを使いますが、次のようなショートカット方法もあります。

email = "Fred Bloggs <fred@bloggs.com>"email.match(/<(.*?)>/)[1]            # => “fred@bloggs.com”email[/<(.*?)>/, 1]                  # => “fred@bloggs.com”email.match(/(x)/)[1]                # => NoMethodError [:(]email[/(x)/, 1]                      # => nilemail[/([bcd]).*?([fgh])/, 2]        # => “g”

2 – Array#joinのショートカット

配列に数値を渡し、要素を複製するArray#*メソッドはよく知られていますが、Array#*に文字を渡すことで、文字列を結合させる方法はあまり知られていないようです。

%w{this is a test} * ", "                 # => “this, is, a, test”h = { :name => "Fred“, :age => 77 }h.map { |i| i * "=" } * "\n"              # => “age=77\nname=Fred”

3- 小数の簡単なフォーマット方法

価格の表示に小数点のフォーマットをそろえるにはsprintfの代わりに次の方法を使うことができます。

oney = 9.5"%.2f" % money                       # => “9.50″

4 – テキストを囲む簡単な方法

#3のフォーマットテクニックと同様に文字列を他の文字列の中に差し込むことができます。

"[%s]" % "same old drag"             # => “[same old drag]”

配列をつかうこともできます。

x = %w{p hello p}"<%s>%s</%s>" % x                    # => “<p>hello</p>"

5 – ファイルツリーを削除

簡単にShellを使ってはいけません。Rubyは使いやすいファイルユーティリティライブラリを持っています。

require 'fileutils'FileUtils.rm_r 'somedir'

このメソッドを使う時は十分ご注意を!

6 – Enum要素を爆破

*はArrayやHashのようなEnum要素を*爆破*することができます。なんの事をいっているかは次の例をみてください。

a = %w{a b}b = %w{c d}[a + b]                              # => [[”a”, “b”, “c”, “d”]][*a + b]                             # => [”a”, “b”, “c”, “d”]
a = { :name => "Fred“, :age => 93 }[a]                                  # => [{:name => “Fred”, :age =>93}][*a]                                 # => [[:name, “Fred”], [:age, 93]]
a = %w{a b c d e f g h}b = [0, 5, 6]a.values_at(*b).inspect              # => [”a”, “f”, “g”]

7 – ローカル値の定義をやめる

空のHashやArray でローカル値の定義する代わりに、次のように定義と同時に使うことができます。

(z ||= []) << 'test'

8 – ハッシュキーに文字やシンボルじゃないものをつかう

シンボルや文字列以外のものをハッシュキーに使っているのをみることはほとんどありませんが、つかうことができ、時に使いやすいでしょう(次の例はあまりよい例ではないですが)。

does = is = { true => 'Yes', false => 'No' }does[10 == 50]                       # => “No”is[10 > 5]                           # => “Yes”

9 – ‘and’ と’or’を使って一行に処理をまとめる

より自信のあるRuby開発者がコードを短くして、ifやunlessなど短い複数行を省くためのトリックです。

queue = []%w{hello x world}.each do |word|queue << word and puts "Added to queue" unless word.length <  2endputs queue.inspect# Output:#   Added to queue#   Added to queue#   [”hello”, “world”]

10 – requireされた時ではなく直接実行されていた場合に何かを行う

このパターンは上級Ruby開発者にはよく使われています。ライブラリとしてや、コマンドラインからディレクトリの下から呼ばれているのではなく、直接rubyコードが呼ばれている場合のみ処理を行います。

if __FILE__ == $0
  # Do something.. run tests, call a method, etc. We're direct.
end

11 – 複数データの簡単割り当て

複数データの割当はRuby開発者が早期に学ぶことですが、簡単な割にほとんど使われていないのには驚きです。

a, b, c, d = 1, 2, 3, 4

要素数の指定がないメソッドの引数として配列を*でバンドルするのは特に役立ちます。

def my_method(*args)a, b, c, d = argsend

つぎのような賢い使い方も

def initialize(args)args.keys.each { |name| instance_variable_set "@" + name.to_s, args[name] }end

12 – 数値の比較に複数の比較ではなくrangeインスタンスを使う

もうif x > 1000 && x < 2000 を使わないで次のコードをつかいましょう。

year = 1972puts  case yearwhen 1970..1979: "Seventies"when 1980..1989: "Eighties"when 1990..1999: "Nineties"end

13 – 配列をつかって重複したコードをカット

%w{rubygems daemons eventmachine}.each { |x| require x }

14 – 比較演算子

比較演算子もまた、Ruby開発者が早期に学ぶトリックですが、ほとんどみることがありません。

puts x == 10 ? "x is ten" : "x is not ten"# Or.. an assignment based on the results of a ternary operation:LOG.sev_threshold = ENVIRONMENT == :development ? Logger::DEBUG : Logger::INFO

15 – ネストされた比較演算子

トラブルを引き起こすでしょうが、比較演算子はネストすることができます。

qty = 1qty == 0 ? 'none' : qty == 1 ? 'one' : 'many'# Just to illustrate, in case of confusion:(qty == 0 ? 'none' : (qty == 1 ? 'one' : 'many'))

16 – Rubyの論理式を簡素に

よくつぎのようなメソッドパターンをみますが、

def is_odd(x)# Wayyyy too long..  if x % 2 == 0    return false  else    return true  endend

おそらく次のように比較演算子を使って、よい短くできるのでは?

def is_odd(x)# Don't EVER put false and true in a ternary operator!!x % 2 == 0 ? false : trueend

確かに。このパターンはよく見ますが、もう一歩すすめてください。

def is_odd(x)# Use the logical results provided to you by Ruby already..x % 2 != 0end

17 - 例外のバックトレースのすべてをみる

def do_division_by_zero; 5 / 0; end  begin    do_division_by_zero  rescue => exception    puts exception.backtraceend

18 – 配列とシングルオブジェクト両方で繰り返し処理

# [*items] はシングルオブジェクトを配列に置き換えます。[*items].each do |item|# …end

19 – Rescueブロックはbeginでくくる必要はない

def x  begin    # …  rescue    # …  endend
def x  # …  rescue    # …end

20 – ブロックコメント

これは古いRuby学校のコードでよくみますが、あまりつかわれていないようです。ポンドマークのついた巨大な行よりも見やすいのでは?

puts "x"=beginthis is a block commentYou can put anything you like here!puts “y”=endputs "z"

21 – rescueの救出

一行でrescueを使う事で例外が発生した場合に値を返すことができます。

h = { :age => 10 }h[:name].downcase                         # ERRORh[:name].downcase rescue "No name"        # => “No name”

原文のコメント欄にも他のTipsや意見等が投稿されていました。

おまけ1 – 6と11を組み合わせるとこんな風にかけます。特にArray#splitと一緒に使うと特に便利です。

> a, b, *c = 1, 2, 3, 4, 5, 6
a => 1
b => 2
c => [3, 4, 5, 6]

おまけ2 – 最初から12個のフォボナッチ数を求める

10.times { (fib ||= [1, 1]) << fib[-1] + fib[-2] }

他にもRubyコードのTipsがあれば知りたいです。

タグ:

have your say

You can skip to the end and leave a response. Pinging is currently not allowed.

Be nice. Keep it clean. Stay on topic. No spam.

You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

:

:


« Arduinoコンテスト2008
» OSXでGoogle App Engineをはじめる