- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是编程新手,正在尝试弄清楚创建类时“初始化”的目的。
这是一个例子:
class Person
def initialize(name)
@name = name
@pet = nil
@home = 'NYC'
end
end
所以初始化就是创建一堆属性我直接说Person.name
就可以拉出来了和 Person.pet
和 Person.home
正确的? “初始化”只是为了将一堆变量压缩到一个地方吗?我这样做会完成同样的事情吗:
class Person
pet = nil
home = 'NYC'
#not so sure how to replicate the @name here.
end
我不能使用 Person.pet
访问这些值吗?和 Person.home
和我在第一个代码中的方式一样吗?
最佳答案
这在 Ruby 中有点棘手(相对于 Java),因为类和类的实例在运行时都是实际对象。因此,一个类有自己的一组变量,并且该类的每个实例也有自己的一组变量(与类的变量不同)。
当你说
class Person
pet = nil
end
您正在设置一个变量 pet,它仅对名为 Person
的类对象有效。
操作类实例的变量的方法是使用方法中的变量:
class Person
def initialize
pet = nil
end
end
在这里,pet 指的是Person
的给定实例 的局部变量。当然,这个 pet 变量按照定义是毫无用处的,因为它只是一个在 initialize
函数完成后消失的局部变量。使此变量在实例的生命周期内持续存在的方法是使它成为一个实例变量,您可以通过在它前面加上@
前缀来实现。因此我们到达了你的第一个初始化:
class Person
def initialize
@pet = nil
# And so on
end
end
所以,至于为什么需要initialize
。由于设置 Person
实例的实例变量的唯一方法是在 Person
的方法中,因此此初始化需要在 some 方法中进行。 initialize
只是在您的实例首次创建时自动调用的方法的方便名称。
关于Ruby:为了方便定义类时是 "initialize"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12095597/
在javascript中,我可以这样写 console.log( person.name || person.nickname || '-' ) 然后会先查找name字段,如果找不到,会回退到nick
在为通用接口(interface)编写回调时,定义他们自己负责创建和访问的本地数据可能很有用。 在 C 中,我只使用一个空指针,类 C 示例: struct SomeTool { int ty
我是一名优秀的程序员,十分优秀!