`
dtzq01
  • 浏览: 6467 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

ruby 重载? 重写?

阅读更多
ruby有重载和重写么?
自己学习整理下,希望大家共同探讨。
首先看看在它们在java中的定义:
Java中,重载(overload)和重写(override)是用来表现多态性的两种重要方式。override也有译作“覆盖”、“覆写”。Java中称作“覆写”比较恰当。

    重载方法是指一个类中,方法名相同、参数列表不同的几个方法,调用时根据不同的参数调用不同的方法。方法重载与返回类型无关。

    覆写方法是指子类有一个方法,方法名、参数列表、返回类型与父类的某个方法完全一致。调用时绘调用子类的方法,而屏蔽掉父类的同名方法。需要注意的是,子类覆写的方法,其可访问性一定要强于或等同于,父类被覆写的同名方法。

ruby有重载吗?
先看一个例子,实现一个类属性的可读写:
class A
  def para(a)
    @para = a
  end
  def para
    @para
  end
end
a = A.new
a.para(1)
puts a.para

有错:
>ruby test.rb
test.rb:10:in `para': wrong number of arguments (1 for 0) (ArgumentError)
from test.rb:10
>Exit code: 1
很明显的,ruby用para方法覆盖了para(a)
稍微把para(a)和para方法定义的位置对调一下:
class A
  def para
    @para
  end
  def para(a)
    @para = a
  end
end
a = A.new
a.para(1)
puts a.para

同样有问题:
>ruby test.rb
test.rb:11:in `para': wrong number of arguments (0 for 1) (ArgumentError)
from test.rb:11
>Exit code: 1
为什么会这样呢?
ruby支持可变参数,根本就没有必要定义两个同名的方法,只用在参数上面做文章就好了。
class A
  def para(*a)
    @para = a.first if a.size == 1
    @para
  end
end
a = A.new
a.para(2)
puts a.para

结果:
>ruby test.rb
2
>Exit code: 0
难道这个就是java中的重载在ruby中的实现?

那么重写呢?
看例子:
class A
  def ow
    puts "Father"
  end
end
class B < A
  def ow
    puts "I am!"
  end
end
b = B.new
b.ow

结果:
>ruby test.rb
I am!
>Exit code: 0

但是有个东西就有点纠结了!
class A
  def ow
    puts "Father"
  end
end
class B < A
  def ow(name)
    puts "I am!" + name
  end
end
b = B.new
b.ow("Jack")
b.ow

结果:
>ruby test.rb
test.rb:13:in `ow': wrong number of arguments (0 for 1) (ArgumentError)
from test.rb:13
I am!Jack
>Exit code: 1
在重载的时候时候也提到了,ruby是看"名字”来认识的,后面ow(name)方法已经把ow方法覆盖了!
由上可知,Ruby语言,只有重写(override),没有其它语言具有的严格意义上的重载(overload)
1
3
分享到:
评论
1 楼 yangbinfx 2012-11-19  
这个问题困扰我好久了!“ruby支持可变参数,根本就没有必要定义两个同名的方法,只用在参数上面做文章就好了。 ”这句话让人豁然明白!

相关推荐

    ruby中$~,$?是线程安全的么?

    NULL 博文链接:https://l-d.iteye.com/blog/1488038

    Ruby语言教程大纲.zip

    压缩包中的图像文件可能包含了教学过程中的示例图解,例如"Ruby??????\????-chen.png"和"Ruby??????\????-hua.png"可能是关于某个主题的解释图。"Ruby??????\"可能是一个未命名的目录,包含更多相关的学习材料。最后...

    Ruby-DataObjects企图重写现有的Ruby数据库驱动程序符合一个标准接口

    Ruby-DataObjects是一个重要的Ruby库,它旨在提供一个统一的接口来访问各种不同的数据库系统,如MySQL、PostgreSQL、SQLite3等。这个项目的主要目标是让开发者能够在不改变代码的情况下,轻松地切换数据库后端,这极...

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby-Roadie试图让发送HTML邮件少一点痛苦通过内联样式表和重写相对URL在你的电子邮件中

    为了解决这些问题,Ruby社区开发了一款名为Roadie的库,其目标就是减轻发送HTML邮件时的痛苦,主要通过内联CSS样式表和重写邮件中的相对URL来确保邮件在各种客户端中显示正常。 首先,我们来看内联样式表的问题。在...

    Ruby-rubybuild编译和安装Ruby

    Ruby是一种动态、开源的编程语言,以其简洁、优雅的语法和强大的元编程能力著称。在Ruby开发中,为了管理不同版本的Ruby环境,我们常常会使用到`rbenv`和`ruby-build`这两个工具。本文将详细介绍如何使用`ruby-build...

    apache mod_ruby

    3. **Ruby重写规则**:结合使用mod_rewrite,你可以创建复杂的URL重写规则,将用户友好的URL映射到Ruby脚本。 4. **部署Web应用**:对于更复杂的应用,如Ruby on Rails,mod_ruby可以与DispatcherGem配合,使Apache...

    ruby DBI ruby DBI ruby DBI

    ruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ...

    Ruby编程,Ruby编程,

    ### Ruby编程语言简介 #### 一、Ruby编程语言概述 Ruby是一种动态的、面向对象的、通用型的编程语言,自1995年由日本程序员松本行弘(Yukihiro Matsumoto)创建以来,便以其简洁优雅的语法、高度可读性和易于学习...

    Ruby完全自学手册 下

    《Ruby完全自学手册》是一本完全覆盖Ruby和Ruby on Rails的完全自学手册。《Ruby完全自学手册》的特色是由浅入深、循序渐进,注重理论和实践的结合。虽然定位为入门手册,但是依然涉及许多高级技术和应用,覆盖到的...

    Ruby-rubyinstall安装RubyJRubyRubiniusMagLevorMRuby

    Ruby是一种强大的、面向对象的脚本语言,广泛用于Web开发、服务器端编程和各种应用程序。在Ruby的世界里,管理不同的Ruby实现(如MRI、JRuby、Rubinius、MagLev和MRuby)是非常重要的,这有助于开发者根据项目需求...

    src-oepkgs/ruby-ruby2ruby

    src-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2...

    ruby2ruby.zip

    ruby2ruby 提供一些用来根据 RubyParser 兼容的 Sexps 轻松生成纯 Ruby 代码的方法。可在 Ruby 中轻松实现动态语言处理。 标签:ruby2ruby

    ruby笔记1ruby笔记1ruby笔记1

    标题中的"ruby笔记1ruby笔记1ruby笔记1"暗示了这是一份关于Ruby编程语言的学习笔记,可能包含了作者在学习过程中的重点、难点以及心得体验。描述中的内容重复了标题,进一步强调了这是关于Ruby的深入学习记录。标签...

    Ruby完全自学手册

    Ruby是一种简洁而功能强大的编程语言,由日本的松本行弘(Yukihiro "Matz" Matsumoto)在1993年开发,并于1995年公开发布。Ruby语言设计之初就非常注重开发人员的编程体验,它拥有自然、表达性强的语法,易于阅读和...

    python-ruby:我应该学习Python还是Ruby?

    我应该学习Python还是Ruby? 乍一看,Python和Ruby似乎是非常相似的语言。 两者都是用于快速开发的高级语言。 两种语言都是优美的语言,如果编写得当,它们会很直观,并且读起来很像英语。 动态是什么意思? 好吧...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

Global site tag (gtag.js) - Google Analytics