Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 如何创建自定义while块_Ruby - Fatal编程技术网

Ruby 如何创建自定义while块

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,而

我知道在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,而我<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中,虽然这对功能不会有太大影响。哦,好的。我只是想知道是否有可能实现类似示例的块,以便于可读性和编写:-)哇,回答得很好!我完全理解了,谢谢你的帮助!我知道语法不是很漂亮,但至少可读性很强:-)