Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby:使用块作为普通(内联)表达式?_Ruby - Fatal编程技术网

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--是的,我也不喜欢括号。我将对开始/结束风格做更多的研究——我可能欠你一个道歉!我会在这里发帖的。