红宝石 |类方法和变量
类方法是在类内部定义的方法,公共类方法可以在对象的帮助下访问。当方法在类定义之外定义时,该方法默认标记为私有。默认情况下,方法被标记为在类定义中定义的公共。
语法 1:
def class_method_name
# some code
end
在这里,我们只能在对象的帮助下访问上述方法。
语法 2:
def class_name.class_method_name or self.class_method_name
# some code
end
在这里,我们可以访问上述方法,无需创建类的对象,因为我们可以直接访问它。
这里, self关键字是指整个类本身,而不是类的实例。在这种情况下,我们只在类内部,而不是在该类的实例方法内部。所以,我们在类范围内。
类变量是在类内部定义的变量,只有类方法可以访问。类变量以@@开头,必须先初始化,然后才能在方法定义中使用。
引用未初始化的类变量会产生错误。类变量在定义类变量的类或模块的后代之间共享。
当一个类变量被覆盖时,它会产生带有 -w 选项的警告。
句法:
@@variable_name = value
类变量和方法有什么用?
假设我们想要计算您添加到购物项目中的杂货数量,为此,我们需要一个除了实例变量之外的变量,因为实例变量对于创建的每个对象都是唯一的,并且通过使用全局变量它可以从程序的任何地方轻松操作。
因此,由于我们使用类变量,并且借助类方法,我们可以跟踪列出的杂货商品总数以及许多其他方式。
下面是示例:
# Program in Ruby for a count of total Grocery items
class Grocery
# class variable
@@total_count = 0
# class array
@@items_list = []
def add_item(item)
# adding item to the array
@@items_list.push(item)
@@total_count += 1#counting
end
def print_items
puts "Total number of items --> #@@total_count";
puts "All items --> #@@items_list";
end
# direct access
def Grocery.printitems_only# or self.printitems_only
puts "\nGrocery.printitems_only", @@items_list.join("\n");
end
end
list = Grocery.new()
list.add_item("shampoo")
list.add_item("face wash")
list.add_item("serum")
list.add_item("mud pack")
list.add_item("tea tree oil")
list.add_item("toner")
list.print_items
# direct access
Grocery.printitems_only
# throws an error
list.printitems_only
输出
Total number of items --> 6
All items --> ["shampoo", "face wash", "serum", "mud pack", "tea tree oil", "toner"]
Grocery.printitems_only
shampoo
face wash
serum
mud pack
tea tree oil
toner
main.rb:35:in `': undefined method `printitems_only' for # (NoMethodError)
Did you mean? print_items
这里我们在#add_item(item)方法中使用@@total_count类变量,这是一个实例方法。添加新项目时,该方法访问@@total_count类变量并将其值加1。而且,我们在#add_item(item)方法内部使用@@items_list类数组,这是一个实例方法.添加新项目时,该方法访问@@items_list类数组并将项目名称添加到数组中。我们可以在类和实例方法中访问类中任何位置的类变量。如果我们使用self.printitems_only或Grocery.printitems_only它们执行相同但在访问时我们只能通过类名访问,因为 self 仅代表类内部的类。