原谅我的英语。 我是一名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"
答案 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"