加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby for循环陷阱?

发布时间:2020-12-16 20:16:51 所属栏目:百科 来源:网络整理
导读:在讨论 Ruby循环时,Niklas B.最近谈到了与每个循环相比的for循环“不引入新的范围”.我想看看一些如何感受到这一点的例子. O.K.,我扩展了一个问题:在Ruby中还有哪些,我们看到什么是apears / end block delimiters,但实际上没有范围?除了…之外还有什么…结
在讨论 Ruby循环时,Niklas B.最近谈到了与每个循环相比的for循环“不引入新的范围”.我想看看一些如何感受到这一点的例子.

O.K.,我扩展了一个问题:在Ruby中还有哪些,我们看到什么是apears / end block delimiters,但实际上没有范围?除了…之外还有什么…结束?

另一个问题的扩展,有没有办法用大括号{block}编写循环?

解决方法

我们举一个例子来说明一点:
results = []
(1..3).each do |i|
  results << lambda { i }
end
p results.map(&:call)  # => [1,2,3]

酷,这是预期的.现在检查以下内容:

results = []
for i in 1..3
  results << lambda { i }
end
p results.map(&:call)  # => [3,3,3]

嗯,怎么回事?相信我,这些类型的错误是令人讨厌的追踪. Python或JS开发者会知道我的意思:)

只有这样,我才能避免像瘟疫这样的循环,尽管有更多的有利于这一立场的理由.正如Ben正确指出的那样,使用Enumerable的正确方法几乎总是导致使用更好的代码,而不是使用普通的旧的,命令式的循环或者每个Enumerable#.例如,上面的例子也可以简明扼要地写成

lambdas = 1.upto(3).map { |i| lambda { i } }
p lambdas.map(&:call)

I expand the question: Where else in Ruby do we see what apears do/end block delimiters,but there is actually no scope inside? Anything else apart from for … do … end?

循环结构中的每一个都可以这样使用:

while true do
  #...
end

until false do
  # ...
end

另一方面,我们可以写出每一个这些没有做(这显然更喜欢):

for i in 1..3
end

while true
end

until false
end

One more expansion of the question,is there a way to write for loop with curly braces { block }

不,那里没有.还要注意,术语“块”在Ruby中具有特殊的含义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读