# Rubyで使うべき21個のワザ _published: 2008/06/19_ ![alt](http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/shunsuk/20080619/1213877532) Rubyで使うべき21個のワザ。元記事はこちら。翻訳ではない上に、かなり端折るので、詳しくは元記事を見てください。 - [21 Ruby Tricks You Should Be Using In Your Own Code](http://www.rubyinside.com/21-ruby-tricks-902.html) C#erからすると、奇々怪々な記述が多いですね。永遠のRuby初心者なので、理解できないとこもありました。 ## 1. ソッコー正規表現抽出 サンプルコードは(自分が理解しやすいように)変えてます。 ```ruby s = "abc" s.match(/(b)(c)/)[0] # => "bc" s.match(/(b)(c)/)[1] # => "b" s.match(/(d)/)[1] # => NoMethodError s[/(b)(c)/, 1] # => "b" s[/(d)/, 1] # => nil ``` `match` の代わりに `[]` を使うと、マッチしてないときにエラーじゃなくて `nil` が返るので便利かもしれません。 ## 2. Array#joinのショートカット ```ruby %w{this is a test} * ", " # => “this, is, a, test” ``` 使えそう。SQL文を生成するときに便利そうです。 ## 3. ソッコー小数フォーマット ```ruby money = 9.5 "%.2f" % money # => “9.50″ ``` `%` に、こんな効果が。 ## 4. ソッコー文字列囲い 上の応用。 ```ruby x = %w{p hello p} "<%s>%s</%s>" % x # => “<p>hello</p>" ``` なんか使えそうな、使えなさそうな。覚えておきます。 ## 5. ディレクトリツリーを削除 Linuxでディレクトリを再帰的に削除するには。 ```sh % rm -r somedir ``` Rubyには便利なユーティリティがあります。 ```ruby require 'fileutils' FileUtils.rm_r 'somedir' ``` ## 6. 一斉列挙? よく分かりません。 ```ruby a = { :name => "Fred", :age => 93 } [a] # => [{:name => "Fred", :age =>93}] [*a] # => [[:name, "Fred"], [:age, 93]] ``` `*` で配列化ってこと? ##7. 変数定義の短縮 ```ruby (z ||= []) << 'test' ``` zが未定義なら `[]` で初期化して、 `'test'` を挿入。 ## 8. ハッシュのキーに非文字列やシンボルを使う ```ruby does = is = { true => 'Yes', false => 'No' } does[10 == 50] # => “No” is[10 > 5] # => “Yes” ``` オモシロイ。けど、実用度は未知数。 ## 9. 1行でandやorによる一括操作 ```ruby queue = [] %w{hello x world}.each do |word| queue << word and puts "Added to queue" unless word.length < 2 end puts queue.inspect # Output: # Added to queue # Added to queue # ["hello", "world"] ``` とにかくコードを短くしたい人向け? ## 10. コマンドラインから起動されたときだけ実行 ```ruby if __FILE__ == $0 # Do something.. run tests, call a method, etc. We're direct. end ``` これは、使えそうです。コマンドラインから起動すると、$0にファイル名が入ります。一方、requireされた場合は何も入らないので、実行されません。 ## 11. 多重代入 ```ruby a, b, c, d = 1, 2, 3, 4 def my_method(*args) a, b, c, d = args end ``` これは、知ってましたよ。ついつい、使わずに書いてしまいますが。 ## 12. caseのwhen節を範囲指定 ```ruby year = 1972 puts case year when 1970..1979: "Seventies" when 1980..1989: "Eighties" when 1990..1999: "Nineties" end ``` これも知ってたけど、使ったことないです。 ## 13. 繰り返しを避ける ```ruby %w{rubygems daemons eventmachine}.each { |x| require x } ``` 3行書くところを、配列にして1行で済ますワザ。 ## 14. 三項演算子 ```ruby puts x == 10 ? "x is ten" : "x is not ten" ``` 三項演算子は、好きです。でも、会社では使うなと言われていたような。 ## 15. 三項演算子のネスト ```ruby qty = 1 qty == 0 ? 'none' : qty == 1 ? 'one' : 'many' ``` これ使うと、FizzBuzzを1行で書けます。 ```ruby (1..100).each {|i| (i % 15 == 0) ? 'FizzBuzz' : (i % 3 == 0) ? 'Fizz' : (i % 5 == 0) ? 'Buzz' : i.to_s } ``` ## 16. Fight redundancy with Ruby's logical provisions ```ruby def is_odd(x) # Use the logical results provided to you by Ruby already.. x % 2 != 0 end ``` 短く書けるよって話? ## 17. 例外のバックトレース情報を見る ```ruby def do_division_by_zero; 5 / 0; end begin do_division_by_zero rescue => exception puts exception.backtrace end ``` どのファイルの何行目で例外が発生したかというアノ情報。 ## 18. 配列でも配列じゃなくても列挙する? スミマセン。よく分かってません。 ```ruby [*items].each do |item| # … end ``` これだと、itemsが配列でも配列じゃなくても、eachを使うことができますね。 ## 19. beginがなくてもrescue書ける ```ruby def x # … rescue # … end ``` へぇ~。メソッド全体をbegin-rescueしたいとき。C#だと、メソッド全体をtry-catchしたらダメだっていうコーディングルールがあったような。 ## 20. ブロックコメント ```ruby puts "x" =begin ブロックコメントです。 何書いてもコメントになるよ。 puts “y” =end puts "z" ``` ありましたね。 ## 21. 1行でrescue ```ruby h = { :age => 10 } h[:name].downcase # ERROR h[:name].downcase rescue "No name" # => “No name” ``` これ便利かも。 ## さいごに 知らなくても書けるけど、知ってると便利なワザですね。 元記事では、他のワザを知っていたらトラックバックで送ってくれと言っています。まだまだ増えそうで楽しみですね。 - [21 Ruby Tricks You Should Be Using In Your Own Code](http://www.rubyinside.com/21-ruby-tricks-902.html) 私は、`*` がよく分かっていないで、調べることにします。 一回読んだけど、頭に入ってないなあ。