Oop 当对象表达式';在源或包的顶层声明了?

Oop 当对象表达式';在源或包的顶层声明了?,oop,object,kotlin,scope,Oop,Object,Kotlin,Scope,我正在学习Kotlin中的对象。我不知道在类之外声明的对象的作用域是什么。 例如: 我检查过的情况(没有得出任何结论): 当我在类外部声明它,然后尝试在函数内部使用它时,point是有效的,但无法识别成员x和y 当我在类外部声明它,然后尝试将它用作类的成员时,它在那里根本不被识别 当我在类之外声明它时(当然是公共的),然后尝试从另一个源文件使用它,它是无法识别的 有人能帮我理解对象表达式的范围吗?object在本例中,创建一个匿名类的对象(与object:Any相同) 从文档: 请注意,匿名对象

我正在学习Kotlin中的对象。我不知道在类之外声明的对象的作用域是什么。 例如:

我检查过的情况(没有得出任何结论):

  • 当我在类外部声明它,然后尝试在函数内部使用它时,point是有效的,但无法识别成员x和y
  • 当我在类外部声明它,然后尝试将它用作类的成员时,它在那里根本不被识别
  • 当我在类之外声明它时(当然是公共的),然后尝试从另一个源文件使用它,它是无法识别的

  • 有人能帮我理解对象表达式的范围吗?

    object
    在本例中,创建一个匿名类的对象(与
    object:Any
    相同)

    从文档:

    请注意,匿名对象只能在本地和私有声明中用作类型。如果将匿名对象用作公共函数的返回类型或公共属性的类型,则该函数或属性的实际类型将是匿名对象声明的超类型,或者如果未声明任何超类型,则为任何。添加到匿名对象中的成员将无法访问

    class C {
    
        // Private function, so the return type is the anonymous object type
        private fun foo() = object {
            val x: String = "x"
        }
    
        // Public function, so the return type is Any
        fun publicFoo() = object {
            val x: String = "x"
        }
    
        fun bar() {
            val x1 = foo().x        // Works
            val x2 = publicFoo().x  // ERROR: Unresolved reference 'x'
        }
    }
    

    point
    是一个公共静态变量,因此该变量的实际类型是
    在任何类之外的文件中声明的任何
    变量都直接在包中声明

    从(对象强调矿山):

    函数、属性和类、对象和接口可以 在“顶级”上声明,即直接在包内声明:

    // file name: example.kt
    package foo
    
    fun baz() { ... }
    class Bar { ... }
    
    • 如果未指定任何可见性修饰符,则默认情况下使用
      public
      ,这意味着您的声明将可见 到处
    • 如果将声明标记为私有,则该声明将仅在包含该声明的文件中可见
    • 如果将其标记为
      内部
      ,则它在同一区域的任何位置都可见
    • 受保护的
      不适用于顶级声明
    注意:要使用来自另一个包的可见顶级声明,您需要 应该还是这样

    示例:

    // file name: example.kt
    package foo
    
    private fun foo() { ... } // visible inside example.kt
    
    public var bar: Int = 5 // property is visible everywhere
        private set         // setter is visible only in example.kt
    
    internal val baz = 6    // visible inside the same module
    
    以及:

    请注意,匿名对象只能在本地和 私人声明。如果使用匿名对象作为返回类型 对于公共功能或公共属性的类型,实际类型 该函数或属性的 匿名对象,或
    Any
    ,如果未声明任何超类型。 添加到匿名对象中的成员将无法访问

    class C {
    
        // Private function, so the return type is the anonymous object type
        private fun foo() = object {
            val x: String = "x"
        }
    
        // Public function, so the return type is Any
        fun publicFoo() = object {
            val x: String = "x"
        }
    
        fun bar() {
            val x1 = foo().x        // Works
            val x2 = publicFoo().x  // ERROR: Unresolved reference 'x'
        }
    }
    
    所以当你这么做的时候

    val point= object {
        public var x: Int = 0
        var y: Int = 0
    }
    
    您正在包中创建类型为
    Any
    public
    对象。由于类型为
    Any
    ,因此无法查找您定义的匿名对象的属性。但是,如果将对象设置为私有对象,则可以使用它:

    private val point= object {
        var x: Int = 0
        var y: Int = 0
    }
    
    val x = point.x
    val y = point.y
    fun editPoint() {
        point.x = 1
        point.y = 2
    }
    

    @IR42,谢谢,但是这个问题是在我已经(完全)阅读了这个链接之后提出的。注意,如果你写
    objectpoint{…}
    而不是
    val point=object{…}
    的话,这个方法就行了,但是我给了它一个名字:point。还是匿名的吗?还有,为什么编辑不抱怨我是在局部范围之外写的?@Eitanos30 anonymous object表示一个匿名类的对象,
    point
    是变量(reference)的名称,当你说:“*”仅在局部和私有声明中“*”时,局部这个词表示函数,或者它可以是其他的东西?还有为什么编辑器不抱怨对象不能在类之外声明?方法、lambda、构造函数、init块中的局部方法。“为什么编辑器不抱怨对象不能在类之外声明”因为它是有效的声明
    只能在local和private中用作类型
    意味着变量的实际类型将是匿名类的类型,您将能够访问匿名类中声明的成员,但我刚才编写了一个代码,私有对象(匿名)在类(包或源范围)之外,文件中的函数可以到达我在对象中定义的所有成员。那么它是如何与当地需求相适应的呢?谁需要隐私呢?返回对象的类,或者返回它定义的对象本身的类?在上面的示例中,您将函数设置为私有。。在较低的级别中,您将对象设置为private。在声明对象的位置,该对象需要是private。上面的例子和下面的例子解释了不同的事情。最上面的示例解释了顶级对象是如何工作的。下面的示例说明了公共/私有对象是如何工作的。不是我写的,它们是文档的直接引用。我编写了最后两个代码块来演示如何使用这些信息来解决您的问题。