新手问题 这个知识点是什么?

woody1983 · 2013年09月23日 · 最后由 TREE 回复于 2013年09月24日 · 2421 次阅读
class Dsl
  def parse
    puts "parse is here."
    Executor.new # <<<--- 是不是走到这里的时候 当前对象的所属类就发生改变?
  end
end

class Executor
  def execute
    "execute is here."
  end
end

调用的时候 发现直接声明这个 Class 的实例 该实例的所属类还是 Dsl 当将 Dsl 的实例方法 parse 赋值给 另一个 object 的时候 他的所属类就变了

irb(main):017:0> obj_dsl = Dsl.new
=> #<Dsl:0x8453154>
irb(main):018:0> obj_dsl.class
=> Dsl
irb(main):019:0> obj_exe = Dsl.new.parse
parse is here.
=> #<Executor:0x82fc06c>
irb(main):020:0> obj_exe.class
=> Executor

这么做也可以

class Dsl
  def parse
    puts "parse is here."
    class << self
      Executor.new
    end
  end
end

可是这个应该不是单例方法吧 因为对象的单例方法应该不会修改对象的所属类 那这个算什么?

你这个写法Executor.new相当于return Executor.new

最后一句的执行结果是作为返回值的

方法默认返回最后一条语句的值。

#2 楼 @zgm 那就是说是 parse 最后一句实际上是将 Executor 的一个打包的实例方法一起 return 给最左边的 obj_exe 了?所以 obj_exe 在这句过后其实是 Executor 的一个实例

我是看这个 44 行写就 Ruby 单元测试框架例子的时候发现一个不懂的地方

感谢楼上两位 看完这个例子 我脑海里一副袁隆平在杂交水稻旁边插秧的画面。。。

@zgm @goinaction

7 楼 已删除

#7 楼 @woody1983 不明白你在讲什么。

理解 ruby 返回值的规则,就明白了,ruby 方法默认返回最后一条语句的值.,obj_exe = Dsl.new.parse 就是把 Executor.new 作为返回值赋值给了 obj_exe, 所以 obj_exe.class => Executor

匿名 #10 2013年09月24日

@woody1983 最后不就是把调用方法的返回值赋给了对象嘛

需要 登录 后方可回复, 如果你还没有账号请 注册新账号