我可能是错的,因为没有人提到它,但我也有这样的印象,其原因也是ruby的遗产,即能够调用没有括号的函数。
显然涉及到Arity,但让我们先把它放在一边,使用没有参数的函数。在像javascript这样必须使用括号的语言中,很容易区分将函数作为参数传递和调用函数。只有在使用括号时才调用它。
my_function // argument
(function() {}) // argument
my_function() // function is called
(function() {})() // function is called
As you can see, naming it or not does not make a big difference. But elixir and ruby allow you to call functions without the brackets. This is a design choice which I personally like but it has this side effect you cannot use just the name without the brackets because it could mean you want to call the function. This is what the & is for. If you leave arity appart for a second, prepending your function name with & means that you explicitly want to use this function as an argument, not what this function returns.
现在匿名函数有点不同,因为它主要用作参数。这也是一种设计选择,但其背后的原因是,它主要用于以函数为参数的迭代器类型的函数。所以显然你不需要使用&,因为默认情况下它们已经被认为是参数了。这是他们的目的。
最后一个问题是,有时候你必须在代码中调用它们,因为它们并不总是与迭代器类型的函数一起使用,或者你可能自己编写了迭代器。对于这个小故事,由于ruby是面向对象的,主要的方法是在对象上使用call方法。这样,就可以保持非强制括号行为的一致性。
my_lambda.call
my_lambda.call()
my_lambda_with_arguments.call :h2g2, 42
my_lambda_with_arguments.call(:h2g2, 42)
现在有人想出了一个捷径,基本上看起来像一个没有名字的方法。
my_lambda.()
my_lambda_with_arguments.(:h2g2, 42)
这也是一种设计选择。现在elixir不是面向对象的,因此我们肯定不会使用第一种形式。我不能说José,但它看起来像是elixir中使用的第二种形式,因为它看起来仍然像一个带有额外字符的函数调用。它已经足够接近函数调用了。
我没有考虑所有的利弊,但看起来在这两种语言中,只要对匿名函数强制使用方括号,就可以只使用方括号。看起来是这样的:
强制括号VS符号略有不同
在这两种情况下,你都是例外,因为你让两者表现不同。既然有区别,您不妨让它变得明显,并使用不同的符号。强制性的括号在大多数情况下看起来很自然,但当事情没有按计划进行时,就会很混乱。
给你。这可能不是最好的解释因为我简化了大部分细节。此外,大部分都是设计选择,我试图给出一个理由,而不是评判它们。我喜欢elixir,我喜欢ruby,我喜欢没有括号的函数调用,但像你一样,我发现结果有时相当误导。
在长生不老药中,它只是一个额外的点,而在红宝石中,你在这个上面有块。block很神奇,我很惊讶你可以用block做多少事情,但它们只在你只需要一个匿名函数的时候起作用,也就是最后一个参数。然后,由于您应该能够处理其他场景,这里就出现了整个方法/lambda/proc/块的混乱。
无论如何……这超出了范围。