Oop 当对象表达式';在源或包的顶层声明了?
我正在学习Kotlin中的对象。我不知道在类之外声明的对象的作用域是什么。 例如: 我检查过的情况(没有得出任何结论):Oop 当对象表达式';在源或包的顶层声明了?,oop,object,kotlin,scope,Oop,Object,Kotlin,Scope,我正在学习Kotlin中的对象。我不知道在类之外声明的对象的作用域是什么。 例如: 我检查过的情况(没有得出任何结论): 当我在类外部声明它,然后尝试在函数内部使用它时,point是有效的,但无法识别成员x和y 当我在类外部声明它,然后尝试将它用作类的成员时,它在那里根本不被识别 当我在类之外声明它时(当然是公共的),然后尝试从另一个源文件使用它,它是无法识别的 有人能帮我理解对象表达式的范围吗?object在本例中,创建一个匿名类的对象(与object:Any相同) 从文档: 请注意,匿名对象
有人能帮我理解对象表达式的范围吗?
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。上面的例子和下面的例子解释了不同的事情。最上面的示例解释了顶级对象是如何工作的。下面的示例说明了公共/私有对象是如何工作的。不是我写的,它们是文档的直接引用。我编写了最后两个代码块来演示如何使用这些信息来解决您的问题。