隱式轉換

有些 Ruby 方法接受一個或多個物件,這些物件可以是

對於每個相關類別,轉換是透過呼叫特定轉換方法來完成

可轉換為陣列的物件

可轉換為陣列的物件是一個物件,它

符合這些需求的 Ruby 核心類別是

本節中的範例使用 Array#replace 方法,該方法接受可轉換為陣列的參數。

此類別可轉換為陣列

class ArrayConvertible
  def to_ary
    [:foo, 'bar', 2]
  end
end
a = []
a.replace(ArrayConvertible.new) # => [:foo, "bar", 2]

此類別不可轉換為陣列(沒有 to_ary 方法)

class NotArrayConvertible; end
a = []
# Raises TypeError (no implicit conversion of NotArrayConvertible into Array)
a.replace(NotArrayConvertible.new)

此類別不可轉換為陣列(to_ary 方法需要參數)

class NotArrayConvertible
  def to_ary(x)
    [:foo, 'bar', 2]
  end
end
a = []
# Raises ArgumentError (wrong number of arguments (given 0, expected 1))
a.replace(NotArrayConvertible.new)

此類別不可轉換為陣列(to_ary 方法傳回非陣列)

class NotArrayConvertible
  def to_ary
    :foo
  end
end
a = []
# Raises TypeError (can't convert NotArrayConvertible to Array (NotArrayConvertible#to_ary gives Symbol))
a.replace(NotArrayConvertible.new)

可轉換為雜湊的物件

可轉換為雜湊的物件

符合這些需求的 Ruby 核心類別是

本節中的範例使用 Hash#merge 方法,該方法接受可轉換為雜湊的參數。

此類別可轉換為雜湊

class HashConvertible
  def to_hash
    {foo: 0, bar: 1, baz: 2}
  end
end
h = {}
h.merge(HashConvertible.new) # => {:foo=>0, :bar=>1, :baz=>2}

此類別不可轉換為雜湊(沒有 to_hash 方法)

class NotHashConvertible; end
h = {}
# Raises TypeError (no implicit conversion of NotHashConvertible into Hash)
h.merge(NotHashConvertible.new)

此類別不可轉換為雜湊(to_hash 方法需要參數)

class NotHashConvertible
  def to_hash(x)
    {foo: 0, bar: 1, baz: 2}
  end
end
h = {}
# Raises ArgumentError (wrong number of arguments (given 0, expected 1))
h.merge(NotHashConvertible.new)

此類別不可轉換為雜湊(to_hash 方法傳回非雜湊)

class NotHashConvertible
  def to_hash
    :foo
  end
end
h = {}
# Raises TypeError (can't convert NotHashConvertible to Hash (ToHashReturnsNonHash#to_hash gives Symbol))
h.merge(NotHashConvertible.new)

可轉換為整數的物件

可轉換為整數的物件

符合這些需求的 Ruby 核心類別是

本節中的範例使用 Array.new 方法,該方法接受可轉換為整數的參數。

此自訂類別可轉換為整數

class IntegerConvertible
  def to_int
    3
  end
end
a = Array.new(IntegerConvertible.new).size
a # => 3

此類別不可轉換為整數(to_int 方法需要參數)

class NotIntegerConvertible
  def to_int(x)
    3
  end
end
# Raises ArgumentError (wrong number of arguments (given 0, expected 1))
Array.new(NotIntegerConvertible.new)

此類別不可轉換為整數(to_int 方法傳回非整數)

class NotIntegerConvertible
  def to_int
    :foo
  end
end
# Raises TypeError (can't convert NotIntegerConvertible to Integer (NotIntegerConvertible#to_int gives Symbol))
Array.new(NotIntegerConvertible.new)

可轉換為字串的物件

可轉換為字串的物件

符合這些需求的 Ruby 核心類別是

本節中的範例使用 String::new 方法,該方法接受可轉換為字串的參數。

此類別可轉換為字串

class StringConvertible
  def to_str
    'foo'
  end
end
String.new(StringConvertible.new) # => "foo"

此類別不可轉換為字串(沒有 to_str 方法)

class NotStringConvertible; end
# Raises TypeError (no implicit conversion of NotStringConvertible into String)
String.new(NotStringConvertible.new)

此類別不可轉換為字串(方法 to_str 帶有參數)

class NotStringConvertible
  def to_str(x)
    'foo'
  end
end
# Raises ArgumentError (wrong number of arguments (given 0, expected 1))
String.new(NotStringConvertible.new)

此類別不可轉換為字串(方法 to_str 傳回非字串)

class NotStringConvertible
  def to_str
    :foo
  end
end
# Raises TypeError (can't convert NotStringConvertible to String (NotStringConvertible#to_str gives Symbol))
String.new(NotStringConvertible.new)