如何使用特定类之外的方法?

时间:2014-05-30 21:59:41

标签: ruby

我有两个类(我不能将它们组合在一起),每个类都在自己的文件中 文件编号1:

class A
  def say_hi
    puts "Hi"
  end
end

文件编号2:

class B
  def say_bye
    puts "bye"
  end
end

我能做到:

apple = A.new
apple.say_hi  

或者:

 baby = B.new
 apple.say_bye

但如果我想这样做:

apple = A.new
apple.say_bye  

或者:

baby = B.new
baby.say_hi

有没有一种简单的方法可以在不重组我的课程的情况下做到这一点?

2 个答案:

答案 0 :(得分:0)

如果是"我应该实例化哪个类?"而你所知道的就是你想要的方法" say_hi"那你可以做......

method = :say_hi

if A.new.respond_to?(method) 
  runner_object = A.new
else
  runner_object = B.new
end

Rails中的主动支持可以让你......

result = A.new.try(:say_hi) || B.new.try(:say_hi)

答案 1 :(得分:0)

如果我理解正确,你需要从流程中调用这些不同的方法,这些方法可以获得其中一个类。

最简单的方法是使用alias_method

class A
  def say_hi
    puts "Hi"
  end
  alias_method :say, :say_hi
end

class B
  def say_bye
    puts "bye"
  end
  alias_method :say, :say_bye
end

apple = A.new
apple.say
# => "Hi"

baby = B.new
baby.say
# => "bye"

如果您无法使用class_eval实际更改类代码,您甚至可以这样做:

A.class_eval { alias_method :say, :say_hi }
B.class_eval { alias_method :say, :say_bye }