为什么java/javascript/python强制在方法名后使用(),即使它不带参数?

ara*_*eae 5 javascript python java methods properties

我最常见的错误之一就是我永远无法记住某些东西是方法还是属性,所以我不断添加或删除括号.

所以我想知道在调用对象的属性和显式方法之间是否存在良好的逻辑.

显然,它允许您拥有共享相同名称的属性和方法,但我认为不会出现太多.

我能想到的唯一的好处是可读性.有时你可能想知道在查看代码时某些东西是方法还是属性,但是在遇到特定的例子时我会遇到麻烦.但我是一个n00b,所以我可能还没有遇到过这样的情况.我很欣赏这种情况的例子.

还有,还有其他语言的差异不明确吗?

无论如何,如果你能回答,每次我犯这个错误都会让我不那么生气^ - ^.

更新:感谢大家到目前为止的精彩答案!我只有大约一个星期的js和1天的python,所以我不知道你可以在不调用它们的情况下引用函数.棒极了.我对java有一点经验,所以这就是我主要来自的地方......任何人都可以提出一个同样引人注目的论据,因为在java中你不能引用函数吗?除了它是一种非常明确的语言,具有所有的好处,包括:).

Gle*_*ard 13

所有现代语言都需要这样,因为引用函数和调用函数是单独的操作.

例如,

def func():
    print "hello"
    return 10
a = func
a()
Run Code Online (Sandbox Code Playgroud)

显然,a = func并且a = func()具有非常不同的含义.

Ruby - 你认为最可能的语言 - 不需要括号; 它可以这样做,因为它不支持引用函数.

  • 你总是可以指望从灌木丛中出来的任何一种批评他们的语言的红宝石,通常是试图重新定义"功能"这个词. (15认同)
  • @Jörg:这个定义在函数式编程语言中可能是正确的,但它不是"函数"在过程编程语言中的意思,如Python,Javascript,Java,C++,PHP,Perl等. (4认同)
  • Ruby不支持引用函数的原因是因为它是面向对象的语言,因此不具有*函数.但它确实有*方法*并且它*支持对方法的引用. (3认同)

Ben*_*son 8

在Python和JavaScript等语言中,函数是一流的对象.这意味着您可以传递函数,就像您可以传递任何其他值一样.函数名称(()in myfunc())后面的括号实际上构成一个运算符,就像+*.而不是意味着"将该数字添加到另一个数字"(在该情况下+),()意味着"执行前面的功能".这是必要的,因为可以在不执行它的情况下使用函数.例如,您可能希望将其与另一个函数进行比较==,或者您可能希望将其传递给另一个函数,例如在此JavaScript示例中:

function alertSomething(message) {
    alert(message);
}

function myOtherFunction(someFunction, someArg) {
   someFunction(someArg);
}

// here we are using the alertSomething function without calling it directly
myOtherFunction(alertSomething, "Hello, araneae!"); 
Run Code Online (Sandbox Code Playgroud)

简而言之:能够在不调用函数的情况下引用函数非常重要 - 这就是为什么必须区分的原因.


hvg*_*des 5

至少在JS中,因为你可以传递函数.

var func = new Function();
Run Code Online (Sandbox Code Playgroud)

你可以这样的东西

 var f = func
 f()
Run Code Online (Sandbox Code Playgroud)

所以'f'和'func'是对函数的引用,而f()或func()是函数的调用.

这是不一样的

var val = f();
Run Code Online (Sandbox Code Playgroud)

它将调用的结果分配给var.

对于Java,你不能传递函数,至少就像在JS中一样,所以没有理由语言需要a()来调用方法.但是它就是这样啊.

我根本不能说蟒蛇.

但重点是不同的语言可能有理由为什么语法可能是必要的,有时语法只是语法.


jve*_*ema 1

通常,属性是访问器,方法执行某种操作。按照这个假设,使用属性很便宜,使用方法很昂贵。

例如,Foo.Bar 会向我表明它将返回一个值,如字符串,而不会产生大量开销。

另一方面,Foo.Bar()(或更可能是 Foo.GetBar())意味着需要检索“Bar”的值,可能是从数据库中检索。

属性和方法有不同的目的和不同的含义,因此在代码中也应该区分它们。

顺便说一句,在我知道的所有语言中,语法差异都是明确的,但在幕后,属性通常被视为简单的特殊方法调用。