Rubyの細かい記法のメモ
begin, end で複数行をインスタンス変数にキャッシュできる
def calc_camage(base) # 最終値={基本値×(1-1/8)×武器補正×攻撃回数} base * (1-1/8) * 8 * 1 end def damage @damage ||= begin atk = 12 dfn = 9 base = atk/2 - dfn/4 calc_camage(base) end end p damage # => 32
文字列の展開をまとめて行う
ar = (1..10).to_a puts ("%03d " * 10) % ar # => 001 002 003 004 005 006 007 008 009 010
Array#assoc, rassoc
2次元配列をHashっぽく操作できる。多分名前の由来は英語の association 。
a2 = [ [:a, 1], [:b, 2], [:c, 3], ] p a2.assoc(:a) # => 1 p a2.rassoc(3) # => :c
Hashにもある。
h = {a: 1, b: 2, c: 3} p h.assoc(:a) # => [:a, 1] p h.select{|k,v| k==:a} # => {:a=>1}
ヒアドキュメント
インデントを気にしなくて良い<<~
は2.3 から入った。
なので、それ以前のバージョンでは <<-
を使う必要がある。
#{}
による変数展開も使える。
age = 33 sql = <<~SQL select * from users where age == #{ age } ; SQL puts sql
引数部分にヒアドキュメントを直接指定もできる。
def foo(arg) puts arg end foo(<<-SQL select * from users where id = 1 ; SQL ) # => select * from users # where id = 1 # ;
at_exit でプログラムの最後に実行できる処理を指定できる
END でも可。後から順に実行される。
at_exit { p 1 } at_exit { p 2 } at_exit { p 3 } END { p 4 } END { p 5 } END { p 6 } # => # 6 # 5 # 4 # 3 # 2 # 1
変数名などにUTF8の文字を使える
ただ、クラス名は頭文字が大文字の半角英字である必要がある。
日本語のメソッド名が書けたりする。
class Nucoぬこ def self.新規作成 new end def 鳴く( 回数 = 1 ) puts "にゃーん" * 回数 end end Nucoぬこ.新規作成.鳴く( 3 ) # => にゃーんにゃーんにゃーん