Ruby 如何创建自定义while块
我知道在ruby中,我们可以使用Ruby 如何创建自定义while块,ruby,Ruby,我知道在ruby中,我们可以使用while循环,但我想知道是否可以创建一个自定义循环,这样我就可以制作如下内容: custom_while i < 5 do puts i i += 1 end i := 0. while: [i < 5] do: [Transcript write: i. i := i + 1]. i := 0. [i < 5] whileTrue: [Transcript write: i. i := i + 1] custom\u,而
while
循环,但我想知道是否可以创建一个自定义循环,这样我就可以制作如下内容:
custom_while i < 5 do
puts i
i += 1
end
i := 0.
while: [i < 5] do: [Transcript write: i. i := i + 1].
i := 0.
[i < 5] whileTrue: [Transcript write: i. i := i + 1]
custom\u,而我<5
把我
i+=1
结束
我目前有以下代码:
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
def custom_while(条件)
环道
如果不是条件,则中断
产量
结束
结束
i=0
当我<5岁时,你可以做什么
把我
i+=1
结束
但是,当计算条件
时,它总是为真(因为它只考虑i<5=true的第一次计算)
任何帮助都将不胜感激
注意:这仅用于教育目的。问题是,条件在传入之前正在评估,因此它永远不会改变
将条件设置为在循环中求值的函数,或使用宏使其更干净。您几乎就得到了它。因此,您的问题是,条件只求值一次?那么,我们知道什么构造可以根据需要经常求值?没错:函数!那么,让我们将条件设置为函数(或Ruby行话中的Proc
):
事实上,在Smalltalk中,块的语法非常轻量级,以至于语言中根本没有控制结构。如果
/,那么
/其他
只是布尔
的一个实例方法,例如:
i % 2 == 0 ifTrue: [Transcript write: "even"] ifFalse: [Transcript write: "odd"].
而实际上是Block
的一个实例方法,所以实际上,您的示例如下所示:
custom_while i < 5 do
puts i
i += 1
end
i := 0.
while: [i < 5] do: [Transcript write: i. i := i + 1].
i := 0.
[i < 5] whileTrue: [Transcript write: i. i := i + 1]
i:=0。
[i<5]whileTrue:[抄本:i.i:=i+1]
注意:我不保证Smalltalk代码,我没有测试它。谢谢你的回答。那么有没有办法像我的第一个例子那样调用它?@GiovanniBenussi,除非Ruby有一个好的宏系统(我记不起来是否有),不,您希望能够制作一个完全相同的。您所能做的最好是将条件包装在lambda中,虽然这对功能不会有太大影响。哦,好的。我只是想知道是否有可能实现类似示例的块,以便于可读性和编写:-)哇,回答得很好!我完全理解了,谢谢你的帮助!我知道语法不是很漂亮,但至少可读性很强:-)