gpt4 book ai didi

raku - 无法将 if 语句分配给变量

转载 作者:行者123 更新时间:2023-12-04 11:18:42 25 4
gpt4 key购买 nike

这里的问题是我不太明白控制流中语句和块之间的区别。
查看三元运算符,我可以使用它来分配变量。但这是一个运算符,所以它就像应用一个函数——不是吗?

> my $variable = True ?? 34 !! 42;
34
因为在 raku 文档中说:
if documentation

if

To conditionally run a block of code, use an if followed by acondition. The condition, an expression, will be evaluated immediatelyafter the statement before the if finishes. The block attached to thecondition will only be evaluated if the condition means True whencoerced to Bool. Unlike some languages the condition does not have tobe parenthesized, instead the { and } around the block are mandatory:


do documentation

do

The simplest way to run a block where it cannot be a stand-alone statement is by writing do before it:


所以这应该适用于两种情况:
> my $variable = do {34};
34

> my $variable = if True {34;} else {43;}
===SORRY!===
Word 'if' interpreted as a listop; please use 'do if' to introduce the statement control word
------> my $variable = if⏏ True {34;} else {43;}
Unexpected block in infix position (two terms in a row)
------> my $variable = if True⏏ {34;} else {43;}
如错误中所述,我需要添加 do :
> my $variable = do if True {34;} else {43;} 
34
所以 if真的没有运行块......或者这里真正的问题是什么?

最佳答案

TL;DR:实际区别在于语句和表达式之间,而不是语句和块之间。 do是创建表达式的语句前缀。
if实际上创建了一个语句(在 Raku 中运行的任何东西都是),然而,它不是一个 expression . do是一个语句前缀,它的作用是将语句变成表达式。
然而,if并不是真正可以分配给变量或处理的一流函数。每当你找到这样的语法片段(或 for,例如),你需要在它们前面加上 do 前缀。来“表达”它们。

say &say.^name;# OUTPUT: «Sub␤»                                                                                                 say &do.^name; # OUTPUT: «===SORRY!=== Error while compiling <tmp>␤Undeclared  routine:␤...
say &if.^name; # OUTPUT: «===SORRY!=== Error while compiling <tmp>␤Undeclared routine:␤ if used at line 1␤␤»
所以 if本身不创建块,也不创建表达式,它只是创建一个语句。您需要在它前面加上 do如果你想让它真正把它变成一个表达式。然而,它确实运行了它后面的块。
让我们回到最初的问题、陈述和块。 Blocks是客体,是一等公民。你可以使用它们,应用它们,传递它们。
my &ifs = { if $_ {34} else {43}};
ifs(True).say; # OUTPUT: «34␤»
语句是您只需运行的一次性块。在某些情况下,它们也是表达式:它们产生一个结果,然后您可以分配该结果。
my &ifs = { if $_ {34} else {43}};
my $result = ifs(True).say; # OUTPUT: «34␤»
say $result; # OUTPUT: «True␤»
ifs(True).say语句打印到输出,它也产生一个可以赋值的结果。所有三行也是语句,事实上,也是表达式。
但是,某些控制结构不创建表达式。

Some others do; for creates a expression; while does not.

if就是一个例子。他们不会产生结果。您将它们用于副作用:运行一个语句(如果为真)或另一个(如果不是)。你可以把它们变成一个块,如上所述,然后传递它们。或者你可以在它们之前加上 do并使它们产生一次性结果,然后您可以使用它。
因此,这在很大程度上取决于您的实际用例。您可以用花括号将 if 语句括起来并创建一个块;或者您可以简单地使用结果创建表达式。或者您可能只想将它用于副作用,什么都不做。

关于raku - 无法将 if 语句分配给变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64438785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com