隱式轉換¶ ↑
有些 Ruby 方法接受一個或多個物件,這些物件可以是
-
給定類別的物件,因此可以照原樣接受。
-
可以隱式轉換為該類別的物件,在這種情況下,呼叫的方法會轉換物件。
對於每個相關類別,轉換是透過呼叫特定轉換方法來完成
-
陣列:
to_ary
-
雜湊:
to_hash
-
整數:
to_int
-
字串:
to_str
可轉換為陣列的物件¶ ↑
可轉換為陣列的物件是一個物件,它
-
具有實例方法
to_ary
。 -
該方法不接受任何引數。
-
該方法傳回一個物件
obj
,其中obj.kind_of?(Array)
傳回true
。
符合這些需求的 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)
可轉換為雜湊的物件¶ ↑
可轉換為雜湊的物件是
-
具有實例方法
to_hash
的物件。 -
該方法不接受任何引數。
-
此方法傳回物件
obj
,其中obj.kind_of?(Hash)
傳回true
。
符合這些需求的 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)
可轉換為整數的物件¶ ↑
可轉換為整數的物件是
-
具有實例方法
to_int
的物件。 -
該方法不接受任何引數。
-
此方法傳回物件
obj
,其中obj.kind_of?(Integer)
傳回true
。
符合這些需求的 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)
可轉換為字串的物件¶ ↑
可轉換為字串的物件是
-
具有實例方法
to_str
的物件。 -
該方法不接受任何引數。
-
此方法傳回物件
obj
,其中obj.kind_of?(String)
傳回true
。
符合這些需求的 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)