我已经做了很多关于在ruby中强制转换对象的搜索,并且只能找到将字符串强制转换为整数或相反的示例。我很好奇如何投射其他更复杂的物体。
例如,对于这些类…
class Animal
attr_accessor :weight, :name
end
class Duck < Animal
def speak
'Quack'
end
end
我希望能做如下的事情。
irb> animal = Animal.new
irb> duck = (Duck)animal
irb> duck.speak
=> "Quack"
但是,我不能很好地理解如何在Java或类似语言中进行铸造。
最佳答案
ruby中的一个对象是用一个特定的类创建的,它将被同一个类销毁,它永远不会改变。你也不能强制转换,你所能做的就是调用转换函数,一个创建新对象或使用另一个对象作为代理的过程。
在您的情况下,您不能强制转换,但可以创建具有相同属性的duck:
class Animal
attr_accessor :weight, :name
def initialize(options)
# Allow calling new with either an options hash, or another
# animal that's intended to be cloned.
case (options)
when Animal
@weight = options.weight
@name = options.name
when Hash
@weight = options[:weight]
@name = options[:name]
end
end
end
class Duck < Animal
def speak(phrase)
'%s says %s' % [ name, phrase.inspect ]
end
end
animal = Animal.new(weight: 10, name: 'Bill')
duck = Duck.new(animal)
puts duck.speak('quack!')
第二个选项是将类似鸭子的功能移到一个单独的模块中,您可以在其中混合:
module ActsAsDuck
def speak
'Quack!'
end
end
animal.extend(ActsAsDuck)
puts animal.speak
将该模块中的任何方法混合到对象实例中。