我已经做了很多关于在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

将该模块中的任何方法混合到对象实例中。

09-10 03:05
查看更多