寻找其他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
你在寻找什么begin ... end.这与blockor不同Proc,因为它不是你可以传递的对象或者是一个创建新范围的闭包,但它应该可以很好地满足你的目的:
def foo
@foo ||= begin
# do complicated stuff
end
end
Run Code Online (Sandbox Code Playgroud)