ruby学習メモ

コマンド展開

OSによりコマンドとしいて実行される。末尾に改行が付く

`echo aaa`
=> "aaa\n"
%x{ echo "aaa" }
=> "\"aaa\"\n"
 def duration=(new_duration)
    puts "new duration = #{new_duration}"
    @duration = new_duration
  end
end
song = Song.new;song.duration = "hogehoge"

代入の返却値は破棄される。

class RetTest

  def hoge=(new_value)
    @value = new_value
    return 100
  end
end

下記の場合は value に 100 ではなく 20 が設定される

test = RetTest.new
value = test.hoge = 20
value
=> 20

属性書き込みメソッドの場合はself が暗黙レシーバにならない

class BrokenAmplifier
  attr_accessor :left_channel, :right_channel
  def volume=(vol)
    left_channel = self.right_channel = vol
  end
end
ba = BrokenAmplifier.new
ba.left_channel = ba.right_channel = 99
ba.volume =  5
ba.left_channel
=> 995 にならない
ba.right_channel
=> 5

多重代入

代入される値が代入に影響を与えない

value = 1
value, value = 100,value
=> [100, 1] ← [100,100]にはならない
value
=> 1
a = [1,2,3,4]

b,  c = a       => [1, 2, 3, 4]        b => 1 c => 2
b, *c = a       => [1, 2, 3, 4]        b => 1 c => [2, 3, 4]
b,  c = 99,  a  => [99, [1, 2, 3, 4]]  b => 99 c => [1, 2, 3, 4]
b, *c = 99,  a  => [99, [1, 2, 3, 4]]  b => 99 c => [[1, 2, 3, 4]]
b,  c = 99, *a  => [99, 1, 2, 3, 4]    b => 99 c => 1
b, *c = 99, *a  => [99, 1, 2, 3, 4]    b => 99 c => [1, 2, 3, 4]
b,(c,d),e=1,2,3,4
=> [1, 2, 3, 4] b => 1 c =>2 d=>nil e=>3

b,(c,d),e=[1,2,3,4]
=> [1, 2, 3, 4] b => 1 c=>2 d=>nil e=>3

b,(c,d),e=1,[2,3],4
=> [1, [2, 3], 4] b=>1 c=>2 d=>3 e=>4

b,(c,d),e=1,[2,3,4],5
=> [1, [2, 3, 4], 5] b=>1 c=>2 d=>3 e=>5

b,(c,*d),e=1,[2,3,4],5
=> [1, [2, 3, 4], 5] b=>1 c=>2 d=>[3, 4] e=>5

+= 演算子

class StringTest
  def initialize(string)
    @value = string.gsub(/[aeiou]/, '*')
  end
  
  def +(other)
    StringTest.new(self.to_s + other.to_s)
  end
  
  def to_s
    @value
  end
end

a = StringTest.new("damn ")
a += "hogehoge"

ruby に ++ や -- はない。