在instance_eval块中使用self进行方法定义之间有区别吗?

时间:2018-08-13 20:31:49

标签: ruby

鉴于self引用了调用instance_eval的对象,在instance_eval块中使用self进行方法定义之间有区别吗?

Z.instance_eval do
  def x
  end

  def self.y
  end
end

> Z.x
 => nil 
> Z.y
 => nil 

self似乎多余,因为self指的是Z。

1 个答案:

答案 0 :(得分:1)

没有区别。正是出于您在问题中解释的原因。

这是 self 的冗余使用示例。在调用方法而不是定义方法时,通常会看到这种情况:

class Donald
  def x
  end

  def y
    self.x # <-- `self` is redundant. We could just call `x` directly.
  end
end

但是,如果您以我的示例的荒谬为借口,则能够明确声明该对象(即使它是self)有时也会很有用。考虑:

class Y; end

class Z; end

Z.instance_eval do
  def random_class
    rand > 0.5 ? Y : self
  end

  def random_class.x
  end
end

在这里,random_class是在运行时求值的-即使self可能是多余的,所以代码在语法上也有效。