📜  红宝石 |类方法和变量

📅  最后修改于: 2022-05-13 01:55:27.171000             🧑  作者: Mango

红宝石 |类方法和变量

类方法是在类内部定义的方法,公共类方法可以在对象的帮助下访问。当方法在类定义之外定义时,该方法默认标记为私有。默认情况下,方法被标记为在类定义中定义的公共。
语法 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_onlyGrocery.printitems_only它们执行相同但在访问时我们只能通过类名访问,因为 self 仅代表类内部的类。