ruby:使用块作为普通(内联)表达式?
从红宝石爱好者那里寻找一点智慧。一段时间以来,为了方便起见,我在一些应用程序中使用了以下功能,我想知道是否有一种语言功能我只是缺少了:ruby:使用块作为普通(内联)表达式?,ruby,Ruby,从红宝石爱好者那里寻找一点智慧。一段时间以来,为了方便起见,我在一些应用程序中使用了以下功能,我想知道是否有一种语言功能我只是缺少了: class Object def as_block yield end end 还有其他用途,但对我来说,通常情况下是条件赋值,它需要一些非平凡的逻辑。有两种明显的方法可以做到这一点: # via a second method: def foo @foo ||= set_foo end # via conditional logic:
class Object
def as_block
yield
end
end
还有其他用途,但对我来说,通常情况下是条件赋值,它需要一些非平凡的逻辑。有两种明显的方法可以做到这一点:
# via a second method:
def foo
@foo ||= set_foo
end
# via conditional logic:
def foo
if @foo
@foo
else
# do complicated stuff
end
end
这两种方法看起来都有点丑陋:在第一种情况下,set#u foo似乎无关,而第二种方法看起来有点恶心。因此,我喜欢这样:
def foo
@foo ||= as_block do
# do complicated stuff
end
end
这里的问题(除了monkey patching对象)是,它实际上是一个依赖项(在monkey patch上),看起来像一个语言特性。也就是说,像这样的东西真的不应该出现在(比如)Rails初始值设定项中——它似乎应该出现在gem中,因此可以正确地管理依赖关系。然后我要打包一个完整的gem,运行五行代码到monkey patch对象
所以,我的问题是:
1.还有人用这个,或者类似的东西吗?
2.Ruby团队是否考虑过在默认情况下包含类似的内容?使用块作为简单的旧表达式似乎是一种非常简单的方法,但它并不存在(据我所知),这让我想知道是否有什么原因不包括它,或者。。。
3.有没有更好的方法可以做到这一点,我只是不知道
谢谢
-E您可以使用:
请注意,调用lambda以实际执行表达式非常重要,即
def foo
@foo ||= lambda do
# do complicated stuff
end
end
将返回lambda而不是计算表达式。您可以使用:
请注意,调用lambda以实际执行表达式非常重要,即
def foo
@foo ||= lambda do
# do complicated stuff
end
end
将返回lambda而不是计算表达式。您要查找的是
开始。。。结束
。这与块
或过程
不同,因为它不是可以传递的对象,也不是创建新范围的闭包,但它应该很好地满足您的目的:
def foo
@foo ||= begin
# do complicated stuff
end
end
你要找的是
begin。。。结束
。这与块
或过程
不同,因为它不是可以传递的对象,也不是创建新范围的闭包,但它应该很好地满足您的目的:
def foo
@foo ||= begin
# do complicated stuff
end
end
答得好。谢谢,Durrr…回答得好。谢谢。是的,我知道开始/结束的方法——事实上,最初几次我碰到这个,我就是这么用的。我的抱怨是。。。从语义和风格两个角度来看,它都被打破了。首先,当我阅读代码时,没有捕获异常的begin/end结构看起来不正确。更重要的是,开始/结束块具有奇怪的属性;例如,@Erik我不知道你为什么认为
begin。。。end
看起来不正确,而就像块一样。。。结束
。依我看,这是使用begin。。。结束
块,另一个是异常处理。创建do while
构造的特殊外壳确实很不幸,但在这种情况下,它实际上只是一个问题,只要您不是有意使用它,就不会遇到这个问题。(例如,你为什么要写begin…end while
而你真正的意思是while;…end
)@Ajedi32,我看了一下这个,这是真的,没有我之前想的那么麻烦。我不知道为什么,但就像我说的,我的大脑在读它,寻找一个确定的陈述。这里有一个有趣的讨论:@Erik嗯,在你链接的答案的评论中有一个人建议,如果你不喜欢begin,可以用括号替代。。。结束
。但就我个人而言,我更喜欢避免在这样的多行表达式中使用括号。@Ajed32--是的,我也不喜欢括号。我将对开始/结束风格做更多的研究——我可能欠你一个道歉!我会在这里发帖的。是的,我知道开始/结束的方法——事实上,在我第一次遇到这个问题时,我就是这么用的。我的抱怨是。。。从语义和风格两个角度来看,它都被打破了。首先,当我阅读代码时,没有捕获异常的begin/end结构看起来不正确。更重要的是,开始/结束块具有奇怪的属性;例如,@Erik我不知道你为什么认为begin。。。end
看起来不正确,而就像块一样。。。结束
。依我看,这是使用begin。。。结束
块,另一个是异常处理。创建do while
构造的特殊外壳确实很不幸,但在这种情况下,它实际上只是一个问题,只要您不是有意使用它,就不会遇到这个问题。(例如,你为什么要写begin…end while
而你真正的意思是while;…end
)@Ajedi32,我看了一下这个,这是真的,没有我之前想的那么麻烦。我不知道为什么,但就像我说的,我的大脑在读它,寻找一个确定的陈述。这里有一个有趣的讨论:@Erik嗯,在你链接的答案的评论中有一个人建议,如果你不喜欢begin,可以用括号替代。。。结束
。但就我个人而言,我更喜欢避免在这样的多行表达式中使用括号。@Ajed32--是的,我也不喜欢括号。我将对开始/结束风格做更多的研究——我可能欠你一个道歉!我会在这里发帖的。