Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何在特定类之外使用方法?_Ruby - Fatal编程技术网

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

Ruby 如何在特定类之外使用方法?,ruby,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 或: 但如果我想做什么: apple = A.new apple.say_bye 或: 有没有一种简单的方法可以在不重新构造类的情况下实现这一点?如

我有两个类(我不能合并它们),每个类都在各自的文件中。
文件编号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  
或:

但如果我想做什么:

apple = A.new
apple.say_bye  
或:

有没有一种简单的方法可以在不重新构造类的情况下实现这一点?

如果是“我应该实例化哪个类?”的情况,而您所知道的只是需要方法“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)

如果我理解正确的话,您需要从获取这些类之一的流中调用这些不同的方法

最简单的方法是使用:

如果您不能实际更改类代码,您甚至可以使用:


您正在挑战OOP…:-)如果一个是模块,另一个是类,这是可能的..但是类-类。。我不知道。你是说如果我把say_hi改成一个模块,我可以让这两个类“需要”这个模块,然后这样运行它?是的。。这就是它的工作原理……你到底想要实现什么?@Broisasze Nothing。。测试红宝石的温度……)
method = :say_hi

if A.new.respond_to?(method) 
  runner_object = A.new
else
  runner_object = B.new
end
result = A.new.try(:say_hi) || B.new.try(:say_hi)
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"
A.class_eval { alias_method :say, :say_hi }
B.class_eval { alias_method :say, :say_bye }