【问题标题】:Are there subtile differences between one and multiline if expressions in Julia?Julia 中的单行和多行 if 表达式之间是否存在细微差别?
【发布时间】:2019-07-10 12:41:14
【问题描述】:

我正在使用 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>

根据我对以下帖子Does Julia have a ternary conditional operator? 的理解,我应该被允许以与三元数大致相同的方式编写 if 表达式,而且我通常可以。但是,对于这种情况,三元运算符似乎按预期工作,但不是 if 表达式

julia>  ((foo())) ? (true,false) : (false,true)
(true, false)

两者之间是否存在细微差别?

正如 crstnbr 在 cmets 中所述,允许使用以下语法:

if ((foo())) true,false else false,true end 

【问题讨论】:

  • 请注意if ((foo())) true,false else false,true end 有效。
  • 注意!谢谢 :) 返回带括号的元组时我应该更改我的标题吗?如果表达式和多行对您有用,一行之间的细微差别会不会?
  • 我要补充一点,抛开语法上的好奇心,我认为在没有适当终止不同语句的情况下编写单行代码是非常糟糕的风格(更不用说想法了)。这完全更具可读性(并且完全避免使用难看的括号):if true; true, false; else; false, true; end

标签: julia


【解决方案1】:

这似乎与 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() ("

此外,正如我在上面的评论中提到的那样,不管上述情况如何,我个人认为这种简洁的 if 会阻止非常糟糕的风格,也是一个坏主意,因为你自己已经想通了。如果您不想分成几行,那么在适当的语句末尾使用分号以显示清晰的分隔符仍然是一个好主意,并且更具可读性(对您自己阅读代码和对解释器) )。

if true; true, false; else; false, true; end
if foo(); true, false; else; false, true; end

【讨论】:

  • 优秀的答案!对于这种极端情况,多行示例中的 \n 解决了这种情况下的问题,它的工作原理与您用分号演示的一样多吗?我同意你的观点,我遇到这个问题的原因是我正在编写一个将语言 X 翻译成 Julia 的转译器,因此原始代码是我的转译器生成的。这让我有点惊讶
  • 是的,通常用于终止语句的换行符与分号相同,反之亦然。显然换行符也可以在非终止上下文中使用,在这种情况下用分号替换可能不合适。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
  • 2017-04-28
  • 2011-04-26
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多