Julia中的一行和多行if表达式之间是否存在细微差别?

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 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 (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