u16suzuの blog

日々学んだことのメモブログです。

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 )
# => にゃーんにゃーんにゃーん

こちらを参考にしました