如果在Ruby中重复编写同一个方法,我们该如何称呼它?

3

我只是在尝试探索ruby中的面向对象编程思想。

使用mixins实现继承。

通过可变参数传递进行重载(不完全等同于)。

我只是想知道,在面向对象编程术语中我们如何称呼它。

class Box
   def method1(str)
      puts "in old method 1"
   end

   def method1(str)
      puts "in new method 1"
   end

end

# create an object
box = Box.new

box.method1("asd")

这是我的Ruby类,显然第二个定义的类会被执行, 但我正在寻求SO上任何专家的理解。


它被称为方法覆盖。在 Ruby 中不存在重载。 - jokklan
@jokklan:它不应该创建一些警告,以修改先前的定义,而不是重新定义或重写。 - Hussain Akhtar Wahid 'Ghouri'
脚手架方法只需要更改,无需在同一类内部进行覆盖(就像您上面的示例一样)。但是,如果您曾经查看过Rails源代码,您会发现许多内部类通过模块和继承覆盖方法。这就是Ruby中继承的工作方式 :) - jokklan
@jokklan:我在我的第一个Rails应用程序中创建域关系时遇到了一些问题,需要帮助,您能通过聊天或邮件提供帮助吗? - Hussain Akhtar Wahid 'Ghouri'
点击下面的链接继续在聊天室中讨论 - jokklan
显示剩余2条评论
2个回答

0
class Box
   def method1(str="")
      puts "in old method 1"
   end
end

传递默认值


这将创建一个带有默认参数的方法,我只想要解释,重新定义相同的方法,使用不同的定义体,我们称之为什么,为什么允许这样做,诸如此类的事情,它与OOPS概念相关的现象是什么。 - Hussain Akhtar Wahid 'Ghouri'

0

重载是指一个类可以有相同的方法名,但参数数量或参数类型不同。参见重载

大多数编程语言都是这种情况,但是Ruby中不存在重载,因为Ruby更关注于方法调用的参数而不是参数类型。参见鸭子类型

例如:

def add(a, b)
     a + b
end
# Above method will work for the each of the following
# add(2, 3)
# add("string1", "string2")
# add([1,2,3], [4,5,6])

因此,有人会想知道如何在Ruby中实现重载,答案是

   def some_method(param1, param2 = nil) 
     #Some code here
   end
   # We can call above method as 
   # 1. some_method(1)
   # 2. some_method(1, 2)

或者

   def some_method(param1, param2 = nil, param3 = nil) 
     #Some code here
   end
   # We can call above method as 
   # 1. some_method(1)
   # 2. some_method(1, 2)
   # 3. some_method(1, 2, 3)

是的,我有差不多相同的想法,但重新定义相同的方法,之前的方法会被丢弃,这是否与OOPS概念有关,关于重载,我已经非常清楚了,谢谢你的解释,但我关心的是我们用新定义编写相同方法的现象,方法不是直接对象,所以不像简单地引用同一类的不同对象,那么在类体中发生了什么? - Hussain Akhtar Wahid 'Ghouri'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接