查看: 2089|回复: 5

[已经解决] 定义new方法和定义initialize有区别吗

[复制链接]
梦石
0
星屑
1944
在线时间
404 小时
注册时间
2015-8-30
回帖
322
发表于 2016-4-12 21:39:31 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
看下面这两段代码:[pre lang="ruby" line="1"]class A
  alias self.old_new self.new
  def self.new
    ...
    self.old_new
  end
end
a = A.new
[/pre][pre lang="ruby" line="0"]class A
  def initialize
    ...
  end
end
a = A.new[/pre]
它们有区别吗?
小仙女一枚~
头像被屏蔽
梦石
0
星屑
88
在线时间
631 小时
注册时间
2014-8-4
回帖
3243
发表于 2016-4-12 22:02:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2016-4-12 23:42:00 | 显示全部楼层
没区别,但你必须时刻注意 new 方法的返回值, initialize 则无所谓
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2016-4-12 23:42:21 | 显示全部楼层
本帖最后由 喵呜喵5 于 2016-4-12 23:52 编辑

没区别,但你必须时刻注意 new 方法的返回值, initialize 则无所谓

啧网络一卡连贴了……看了下你问题的描述

你一楼给出的代码是有区别的,因为你的第一段代码根本无法运行

另外多说一句,我个人看来,去重定义 Class.new 是很蠢的一件事
回复

使用道具 举报

梦石
0
星屑
1944
在线时间
404 小时
注册时间
2015-8-30
回帖
322
 楼主| 发表于 2016-4-13 19:30:05 | 显示全部楼层
喵呜喵5 发表于 2016-4-12 23:42
没区别,但你必须时刻注意 new 方法的返回值, initialize 则无所谓

啧网络一卡连贴了……看了下你问题的 ...

那为什么alias不能重定义类方法呢?如果要用第一种方法的话,是不是要这样:
  1. class A
  2. end
  3. class << A
  4.   alias old_new new
  5.   ...
  6. end
复制代码
小仙女一枚~
回复

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2016-4-13 20:58:34 | 显示全部楼层
本帖最后由 喵呜喵5 于 2016-4-13 21:06 编辑
有丘直方 发表于 2016-4-13 19:30
那为什么alias不能重定义类方法呢?如果要用第一种方法的话,是不是要这样: ...


个人理解(未必正确):
因为和 js 或者 python 语言不同,在 Ruby 中,方法并不是对象
所以,作为关键字,如果 alias 支持方法调用(.),那么 Ruby 将无法判断,你是希望 alias 方法本身还是这个方法执行后的返回值,否则的话
  1. alias self.old_new self.new
复制代码
在逻辑上等同于
  1. a = self.old_new
  2. b = self.new
  3. alias a b
复制代码
你所 alias 的不是这个方法,而是执行这个方法后的返回值


另外,还是那句话,去 alias new 是一件很蠢的事情,我也想不到有什么场景需要 alias new

评分

参与人数 1梦石 +1 收起 理由
正太君 + 1 精品文章

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部