在Ruby中调用具有相同名称的函数和方法

时间:2014-08-23 18:08:09

标签: ruby

原谅我的英语。 我是一名php程序员,现在我想学习Ruby。 在php中,如果你想在一个类中调用函数“foo”,你只需要调用foo(),如果你想调用方法“foo”,你可以调用this-> foo()。 问题是,是否可以在Ruby中调用具有相同名称的函数和方法?

例如:

def foo
  puts "In foo function"
end

class A
  def call_foo
    foo
    #How can i call foo function, not a method?
  end

  def foo
    puts "In foo method"
  end
end

a = A.new

a.call_foo #Prints "In foo method"

2 个答案:

答案 0 :(得分:1)

Ruby中没有函数,只有方法。

如果在顶层定义方法,则它是Object的实例方法。

如果你定义一个没有超类的类,它的超类是Object

因此,您的A#foo只会覆盖Object#foo。如果它覆盖Object#foo,它应该尊重它的合同。如果Object#foo正确执行A合同,则永远不需要在A#foo上致电Object#foo(并且它应该,否则将违反Liskov替换原理)。如果要在Object#foo中重用A#foo的实现,可以使用super来遵循超类实现。

注意:您希望使用反射 ,但正确的解决方案是修复您的设计:

def foo
  puts "In foo function"
end

class A
  def call_foo
    self.class.superclass.public_instance_method(:foo).bind(self).()
  end

  def foo
    puts "In foo method"
  end
end

a = A.new

a.call_foo #Prints "In foo function"

答案 1 :(得分:0)

类定义之外的foo方法绑定到Object,它是Class的一个实例。所以,要调用您的方法,您可以这样做:

> Object.foo­
  => "In foo function"

但正如之前所指出的,你应该在适当的类中声明这个方法。

您还可以将此方法声明为类方法:

class A
  def self.foo
    puts "In foo class method"
  end
end

现在你可以在不创建A实例的情况下调用它:

> A.foo
  =>  puts "In foo class method"