【问题标题】:Are methods also objects like functions are?方法也是像函数一样的对象吗?
【发布时间】:2020-12-08 14:56:01
【问题描述】:

我读到函数(AKA 静态方法)是对象(Function 类的实例)。方法(实例函数)也是对象吗?我在官方文档中找不到答案。它只说函数是对象(但没有解释所有函数是否都是对象,包括方法)。

【问题讨论】:

  • 这是dart tour: Everything you can place in a variable is an object, and every object is an instance of a class. Even numbers, functions, and null are objects. All objects inherit from the Object class
  • 我记得读过那篇文章,但我认为您不能将方法(对象的一部分)放在变量中。我认为可能只有包含该方法的整个对象。

标签: function object dart methods


【解决方案1】:

很容易验证方法是一个对象:

class Foo {
  bar() {}
}

void main() {
  print(Foo().bar is Object); // prints true
}

并且 linter 显示警告:

不必要的类型检查,结果始终为真

【讨论】:

  • 我还没有设置用于在 Dart 中编码的 IDE。只是在看教程和阅读文档来研究这是否适合我的目的。我也认为这个问题应该有一个明确的答案(至少在 SO,如果不是在官方文档中)。所以谢谢你的回答!
【解决方案2】:

从技术上讲,答案是“不”。实际上,这并不重要。

实例方法是类的属性,可以通过作为这些类实例的对象调用。一个方法本身并不是一个,所以问它是否是一个对象是没有意义的,因为所有的对象都是值。您可以按名称引用方法(它是“可表示的”),仅此而已。您不能将表达式计算为方法或将其存储在变量中。

然而,你可以从对象中分离一个实例方法。当您这样做时,会创建一个 new 函数对象,调用该函数对象时,将使用相同的参数调用原始对象上的方法。 该函数对象既是函数又是对象。但是,如果一个人是迂腐的,那并不是方法本身。

在实践中,如果你想问某个东西是否是一个对象,它可能已经是一个值,然后那个东西一个对象。

(静态方法在技术上也不是对象,但它们与您撕下它们时创建的函数对象非常接近,因此这种区别实际上并不重要。语言语义有所不同,因为当您创建一个对象,它是哪个对象很重要 - 它等于和相同 - 在你创建一个值之前,语言更喜欢不必指定它。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2014-02-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多