猫言猫语

严以律己·宽以待人·自强不息·知行合一

替换Ruby Block中self对象内容

| 替换Ruby Block中self对象内容已关闭评论

本文我们将向大家介绍如何利用instance_eval函数替换block中self对象内容

第一段示例代码

首先我们使用Ruby语言库的times方法来实验下普通情况下在block中输出self是什么效果

1.times do
  puts self
end
main

可以看到输出的是main,这个main其实是当前运行环境的self值,在irb中直接执行 puts self 也是同样效果

第二段示例代码

如果想让block内调用的self指向目标对象实例,一种办法是把self当做参数传递给block

class Table
  def initialize
    yield self
  end
end

Table.new do |t|
  puts self
  puts t
end
main
#

此时block的参数t就是Table类的实例了,但此时self值还是main环境

第三段示例代码

其实我们可以利用instance_eval函数来达到我们想要的效果

class Table
  def initialize(&block)
    instance_eval &block
  end
end

Table.new do |t|
  puts self
  puts t
end
#
#

这个时候不管是self还是t,指向都是Table类的实例了

更完善的代码

class Table
  def initialize(*args, &block)
    instance_eval &block if block_given?
  end
end

评论已关闭。