ruby – 如何创建自定义块
发布时间:2020-12-17 03:10:33 所属栏目:百科 来源:网络整理
导读:我知道在 ruby中我们可以使用while循环,但我想知道我是否可以创建一个自定义循环,所以我可以做这样的事情: custom_while i 5 do puts i i += 1end 我目前有这个代码: def custom_while(condition) loop do break if not condition yield endendi = 0custom
我知道在
ruby中我们可以使用while循环,但我想知道我是否可以创建一个自定义循环,所以我可以做这样的事情:
custom_while i < 5 do puts i i += 1 end 我目前有这个代码: def custom_while(condition) loop do break if not condition yield end end i = 0 custom_while i < 5 do puts i i += 1 end 然而,当评估条件时,它总是变为真(因为它认为i <5的第一次评估仅为真. 任何帮助将不胜感激! 注意:这仅用于教育目的. 解决方法
你几乎拥有它.那么,你的问题是条件只评估一次?那么,我们知道我们可以根据需要经常评估哪种结构?那是对的:功能!所以,让我们使条件成为一个函数(或Ruby语言中的Proc):
def custom_while(condition) loop do break unless condition.() yield end end i = 0 custom_while -> { i < 5 } do puts i i += 1 end # 0 # 1 # 2 # 3 # 4 遗憾的是,这并不像其他语言那样漂亮. Ruby的语法和语义针对以1“函数”作为参数的方法进行了积极优化. Ruby有一个特殊的语法和语义轻量级构造,即块.但是,只要你有一个以上,你就不幸了. 将其与具有适当块文字的语言(例如Smalltalk)进行比较.在Smalltalk中,你可以在:do:中编写一个方法,并像这样调用它: i := 0. while: [i < 5] do: [Transcript write: i. i := i + 1]. 实际上,在Smalltalk中,块的语法非常轻巧,因此语言中根本没有控制结构. if / then / else只是布尔值的实例方法,例如: i % 2 == 0 ifTrue: [Transcript write: "even"] ifFalse: [Transcript write: "odd"]. 虽然实际上是Block的实例方法,但实际上,您的示例将如下所示: i := 0. [i < 5] whileTrue: [Transcript write: i. i := i + 1] 注意:我不保证Smalltalk代码,我没有测试它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |