【问题标题】:Why is a Julia function name (without arguments) silently ignored?为什么 Julia 函数名(不带参数)会被静默忽略?
【发布时间】:2019-02-08 06:52:25
【问题描述】:

我有一个脚本,定义了一个函数,后来打算调用这个函数却忘了加括号,像这样:

function myfunc()
    println("inside myfunc")
end
myfunc  # This line is silently ignored. The function isn't invoked and there's no error message.

过了一会儿,我确实发现我错过了括号,但是由于 Julia 没有给我错误,我想知道那行实际上在做什么?我假设它必须对 myfunc 语句做一些事情,但我对 Julia 的了解不够了解正在发生的事情。

我尝试了--depwarn=yes,但没有看到julia 命令行开关来提高警告级别或详细程度。如果存在请告诉我。

对于背景上下文,出现这种情况的原因是我正在尝试将 Bash 脚本转换为 Julia,并且在许多位置定义并调用了无参数函数,而在 Bash 中你不需要函数名后需要括号来调用它。

脚本正在从命令行 (julia stub.jl) 运行,我在 macOS 上使用 Julia 1.0.3。

【问题讨论】:

    标签: julia


    【解决方案1】:

    它不会默默地忽略该功能。在交互式会话中调用 myfunc 将向您展示会发生什么:调用将函数对象返回到控制台,因此调用 showshow 方法,显示当前在您的工作区中为该函数定义了多少方法.

    julia> function myfunc()
               println("inside myfunc")
           end
    myfunc (generic function with 1 method)
    
    julia> myfunc
    myfunc (generic function with 1 method)
    

    由于您在脚本中调用它,因此永远不会调用 show,因此您看不到任何结果。但它不会出错,因为语法是有效的。 感谢 DNF 对它在脚本中的有用评论。

    【讨论】:

    • 它在一个脚本里面,所以大概show没有被调用。
    • 谢谢,我已经修改了回复。
    • 谢谢,很高兴我可以使用 repl 来获得更多反馈。大卫的答案对我来说更清楚,所以我将其标记为答案,尽管你的答案也是正确的。
    【解决方案2】:

    什么都不做。

    与 c 中一样,表达式具有值:在 c 中,表达式_a=1+1; _ 的值为 _ 2 _ 在 c 中,这只是从解析器中掉出来的:他们希望能够评估像 _ a==b _ 这样的表达式

    在 Julia 中,这是设计一种语言的结果,您编写的代码将作为该语言的数据对象处理。在 Julia 中,表达式“a=1+1”的值是“a=1+1”。

    在c中,

      a=1+1;
    

    是可接受的代码行意味着,意外地,

      a;
    

    也是可接受的代码行。在 Julia 中也是如此:编译器希望在那里看到一个数据值:您输入的任何数据值都可能是可接受的:甚至例如表示函数返回的计算值的数据值:

     myfunc()
    

    或代表函数对象本身的值:

    myfunc
    

    与在 c 中一样,数据值在代码中无处不在的事实仅表明该语法允许在代码中无处不在的数据值,并且编译器对代码中无处不在的数据值不做任何事情。

    【讨论】:

    • 谢谢,这是有道理的;我应该猜到这就是它在做什么。我对exit()exit 有同样的问题,但马上就发现了。当表达式是像这样的裸函数对象时,我希望有一种方法可以得到警告,但我想我会习惯它,因为我不会在其他语言中犯这个错误。
    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2011-08-30
    相关资源
    最近更新 更多