Project1

标题: 定义new方法和定义initialize有区别吗 [打印本页]

作者: 有丘直方    时间: 2016-4-12 21:39
标题: 定义new方法和定义initialize有区别吗
看下面这两段代码:
RUBY 代码复制
  1. class A
  2.   alias self.old_new self.new
  3.   def self.new
  4.     ...
  5.     self.old_new
  6.   end
  7. end
  8. a = A.new
RUBY 代码复制
  1. class A
  2.   def initialize
  3.     ...
  4.   end
  5. end
  6. a = A.new

它们有区别吗?
作者: 冷峻逸    时间: 2016-4-12 22:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: 喵呜喵5    时间: 2016-4-12 23:42
没区别,但你必须时刻注意 new 方法的返回值, initialize 则无所谓
作者: 喵呜喵5    时间: 2016-4-12 23:42
本帖最后由 喵呜喵5 于 2016-4-12 23:52 编辑

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

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

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

另外多说一句,我个人看来,去重定义 Class.new 是很蠢的一件事
作者: 有丘直方    时间: 2016-4-13 19:30
喵呜喵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
复制代码

作者: 喵呜喵5    时间: 2016-4-13 20:58
本帖最后由 喵呜喵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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1