ruby:使用块作为正常(内联)表达式?

Eri*_*rik 1 ruby

寻找其他Rubyists的小智慧.有一段时间了,我在一些应用程序中使用了以下方便,我想知道是否有一种我缺少的语言功能:

class Object
  def as_block
    yield
  end
end
Run Code Online (Sandbox Code Playgroud)

还有其他用途,但我的正常情况是条件赋值需要一些非平凡的逻辑.两种明显的方法:

# via a second method:
def foo
  @foo ||= set_foo
end

# via conditional logic:
def foo
  if @foo
    @foo
  else
    # do complicated stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

这两种方法看起来都很丑陋:在第一种情况下,#set_foo似乎无关紧要,而第二种看起来有点令人讨厌.所以,相反,我喜欢这个:

def foo
  @foo ||= as_block do
    # do complicated stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

这里的问题(除了猴子修补对象)是它真的是一个依赖(在猴子补丁上)看起来像一个语言功能.也就是说,像这样的东西真的不应该在(比方说)Rails初始化器中 - 它似乎应该在一个gem中,所以可以正确地管理依赖.然后我打包整个宝石来运行五行代码来修补对象...

所以,我的问题:1.其他人使用这个,或类似的东西?2.默认情况下Ruby团队是否考虑过包含这样的内容?使用块作为简单的旧表达似乎是一种非常简单的方法,但它并不存在(据我所知),这让我想知道是否有某种原因不包括它,或者...... 3.是否已经有一些更好的这样做的方式,我只是不知道?

谢谢!

-E

Aje*_*i32 5

你在寻找什么begin ... end.这与blockor不同Proc,因为它不是你可以传递的对象或者是一个创建新范围的闭包,但它应该可以很好地满足你的目的:

def foo
  @foo ||= begin
    # do complicated stuff
  end
end
Run Code Online (Sandbox Code Playgroud)