gpt4 book ai didi

ruby - ruby 中的类方法语法

转载 作者:数据小太阳 更新时间:2023-10-29 07:57:19 25 4
gpt4 key购买 nike

我正在阅读的 ruby 书让我有些困惑。如果我执行以下操作,我就会完全理解为什么代码会抛出错误;

class Person
def show_name
puts @name
end
end

person = Person.new
person.show_name
Person.show_name #(note the capital P) this line falls over

它抛出一个错误,指出 Person 类没有名为 show_name 的方法,因为它是一个实例方法。我完全理解这一点。书中接着抛出这个例子;

class Class
def add_accessor(accessor_name)
self.class_eval %Q{attr_accessor :#{accessor_name}}
end
end

class Person
end

person = Person.new
Person.add_accessor :name #note the capital P
Person.add_accessor :age #capital P here too

person.name = "Mikey"
person.age = 30

puts person.name

并继续说明您可以动态地向类添加方法是多么酷。我不明白的是为什么当方法本身没有这样定义时,为什么突然允许我将“add_accessor”方法作为类方法(使用大写 P)调用?我以为所有的类方法都必须这样声明?

class Math
def self.PI
3.141
end
end

puts Math.PI

有没有大佬能指教一下?

最佳答案

Ruby 类是与其他所有对象一样的对象。您的 Person 类实际上是类 Class 的对象,后者又继承自类 Module。当您将方法作为实例方法添加到类 Class 时,您为所有类提供了一个新方法。如果您在 Person 中使用 def 声明它,则没有对象就无法调用它。要为一个类而不是所有类添加类方法,您必须在方法名称前加上 self 或类名:

class Person
def instance_method
end
def self.class_method
end
def Person.other_class_method
end
end

当您将方法声明为 self.class_method 时,您是在将您的方法声明为类对象上的单例方法。 self 在类或模块声明中指的是类对象,这就是为什么 self.Person. 是一样的。在处理 Ruby 时,请记住一切 都是对象,一切都有方法。 Ruby 中也没有函数,尽管表面上看起来恰恰相反。始终是方法和对象。

关于ruby - ruby 中的类方法语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8279374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com