当前位置:  开发笔记 > 编程语言 > 正文

在Ruby中使用什么是|| = begin .... end block?

如何解决《在Ruby中使用什么是||=begin.endblock?》经验,为你挑选了3个好方法。

这两个代码片段有什么区别:

   def config
    @config ||= begin
      if config_exists?  
        @config = return some value
      else
        {}
      end
    end
  end

  def config
    @config ||= method
  end

  def method
    if config_exists?
      return some value
    else
      {}
    end
  end

我对" begin...... end"块感到困惑.输出有什么不同吗?如果没有,那么begin... end块的使用是什么?



1> Jon..:

首先,您需要知道定义的方法本身就包含begin ... end块的功能.

在异常处理的上下文中,def method_name ... end在功能上等同于begin ... end.两者都可以包含rescue例如语句.

您共享的两个代码块实际上是相同的,并且在一个代码中没有任何好处......除非您method需要多个代码.在这种情况下,通过将逻辑放入单个方法并从多个其他位置调用它来干掉代码.



2> Stefan..:

在您的情况下,您甚至可以省略begin ... end块:

@config ||=
  if config_exists?  
    return_some_value
  else
    {}
  end

或者,使用三元if:

@config ||= config_exists? ? return_some_value : {}

它的输出有什么不同吗?

可能会有所不同,因为与块不同def ... end,begin ... end块不会创建新的变量范围.

这是一个人为的例子:

def foo
  a = 456  # doesn't affect the other a
end

a = 123
b = foo

p a: a, b: b #=> {:a=>123, :b=>456}

与:

a = 123
b = begin
  a = 456  # overwrites a
end

p a: a, b: b #=> {:a=>456, :b=>456}



3> 小智..:

使用||= begin...end允许您记住在中运行的任何内容的结果begin...end.这对于缓存资源密集型计算的结果很有用.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有