Julia中的一行和多行if表达式之间是否存在细微差别?
我正在使用Julia 1.1.1,昨天发现了一些有趣的东西 下面是一个简单的例子 考虑以下代码:Julia中的一行和多行if表达式之间是否存在细微差别?,julia,Julia,我正在使用Julia 1.1.1,昨天发现了一些有趣的东西 下面是一个简单的例子 考虑以下代码: julia> if ((true)) true else false end true 按计划工作 但是,在尝试执行以下操作时: julia> function foo() true end foo (generic function with 1 method) julia> if ((foo())) (true,false) else (fal
julia> if ((true)) true else false end
true
按计划工作
但是,在尝试执行以下操作时:
julia> function foo()
true
end
foo (generic function with 1 method)
julia> if ((foo())) (true,false) else (false,true) end
ERROR: syntax: space before "(" not allowed in "foo() ("
julia>
然而,当以标准方式编写表达式时,它似乎是有效的
julia> if ((foo()))
(true, false)
else
false
end
(true, false)
julia>
根据我在以下帖子中的理解,我应该被允许以与ternaries和我通常能用的大致相同的方式编写if表达式。然而,在这种情况下,三元运算符似乎按预期工作,而不是if表达式
julia> ((foo())) ? (true,false) : (false,true)
(true, false)
两者之间是否存在细微差别
如crstnbr评论中所述,允许使用以下语法:
if ((foo())) true,false else false,true end
这似乎和if块本身没有任何关系。这只是一个语法错误 实际上,julia在调用函数时禁止使用语法
myfun(args)
(即函数名和括号之间不允许有空格)
由于函数的输出(例如,在本例中为foo()
)可能是另一个函数,因此必须对返回的参数应用相同的规则。将foo()
函数包装在无限括号中无法解决此问题,因为仍然会要求通过错误的语法对该表达式的输出求值
例如,请注意:
julia> foo()()
ERROR: MethodError: objects of type Bool are not callable
Stacktrace:
[1] top-level scope at none:0
鉴于
julia> foo() ()
ERROR: syntax: space before "(" not allowed in "foo() ("
此外,正如我在上面的评论中提到的,不管上面提到的是什么,我个人都会考虑这样的简洁<代码>,如果阻止非常糟糕的风格,也是一个坏主意,正如你自己所想的那样。如果您不想分成几行,那么在适当的语句末尾使用分号来表示清楚的分隔(对您阅读代码和解释器来说)仍然是一个好主意,而且可读性更高
i、 e请注意,
if((foo())true、false、else false、true end
有效。注意!谢谢:)当返回带括号的元组时,我应该更改标题吗?在一行if表达式和多行工作之间会有细微的差别吗?我想补充一下,句法好奇,我认为这是一个非常糟糕的风格(更不用说想法)来写一个内衬而不适当地终止不同的语句。这完全更具可读性(并且完全避免使用难看的括号):如果为true;对,错;其他的假,真;结束
回答得很好!对于这种情况,多行示例中的\n解决了这个问题。在这种情况下,它的工作原理与分号no?我同意你的观点,我遇到这个问题的原因是我正在编写一个transpiler,它将语言X翻译成Julia,因此原始代码是我的transpiler生成的。这让我有点吃惊是的,通常用于终止语句的换行符与分号的作用相同,反之亦然。显然,换行符也可以在非终止上下文中使用,在这种情况下,用分号替换可能不合适。
if true; true, false; else; false, true; end
if foo(); true, false; else; false, true; end