self所指的是当前或者默认对象,是一个在程序运行中依次分配给许多对象的角色。
一、理解self、当前对象或默认对象
Ruby编程的基础之一即默认对象或当前对象,在程序中是通过关键字self来访问的。在程序运行中的每一处有且只有一个,正如读者所见作为self它有确定的特权。
在 Ruby 中,self 关键字用于引用当前对象。在不同的场合下,self 所指代的对象可能会有所不同:
1、在类方法中,self 指代的是类对象本身。例如:
ruby
class MyClass
def my_class_method
puts "In my_class_method, self is #{self}"
end
end
MyClass.new.my_class_method # 输出 "In my_class_method, self is #<MyClass:0x0000000103a8>"
2、在实例方法中,self 指代的是当前实例对象。例如:
ruby
class MyClass
def my_instance_method
puts "In my_instance_method, self is #{self}"
end
end
my_instance = MyClass.new
my_instance.my_instance_method # 输出 "In my_instance_method, self is #<MyClass:0x0000000103a8>"
3、在模块方法中,self 指代的是当前模块对象。例如
ruby
module MyModule
def my_module_method
puts "In my_module_method, self is #{self}"
end
end
MyModule.my_module_method # 输出 "In my_module_method, self is MyModule"
二、判定作用域
作用域指的是范围或者标识符的可见度。不同的标识符有着不同的作用域规则。
1、全局作用域和全局变量
全局作用域是一个覆盖整个程序的作用域。全局变量享有全局作用域,可以通过开头的美元字符识别它们,它们在任何地方都可用。
Ruby解释器启动时会初始化大量的内置全局变量。这些变量存储着在程序的任何地方可能会使用的信息。
全局变量虽然很方便,但是使用全局变量往往最终会改变稳定、灵活的程序设计方案,而不会有助于设计。面向对象编程最主要的一个思想是把数据和动作封装到对象之中。
2、局部作用域
局部作用域是每个Ruby程序构造的基础层面。在任何特定的时刻,用户的程序都在一个特殊的局部作用域中,从一个局部作用域到另一个局部作用域的改变,主要过程是对局部变量的替换。
在 Ruby 中,局部作用域是指在代码块(例如 if 语句、for 循环、while 循环等)中定义的变量作用域。局部变量只能在该代码块内部访问,在代码块外部无法访问。
3、类变量语法、作用域和可见性
ruby
class MyClass
@@var = "value"
end
在这个例子中,定义了一个名为 MyClass 的类,并在该类中定义了一个名为 @@var 的类变量。类变量使用 @@ 前缀来表示它们是类变量,而不是实例变量。
类变量的作用域是整个类,它们可以在类的所有方法中访问。但是,类变量的可见性受到类的封装性的限制。类的封装性是指类的内部状态只能被类自身的方法所访问,而不能被外部代码所访问。因此,类变量的可见性仅限于类的方法,而不能在类的外部访问。
三、类的三个访问级别
在 Ruby 中,对象有三个访问级别:public、protected 和 private。这些访问级别控制了对象的成员变量和方法的可见性,以保护对象的内部状态,并确保对象的封装性。
1、Public access level(公共访问级别)
Public access level 是最高的访问级别,表示成员变量或方法可以从任何代码访问,包括其他类的代码。在 Ruby 中,没有特殊的语法来表示 public access level,因为它是默认的访问级别。
ruby
class MyClass
attr_accessor :var
end
my_instance = MyClass.new
my_instance.var = "value"
2、Protected access level(保护访问级别)
Protected access level 是中间的访问级别,表示成员变量或方法可以从该类和其子类或父类的代码访问。在 Ruby 中,使用 protected 关键字来表示 protected access level。
ruby
class MyClass
protected
attr_accessor :var
end
class MySubclass < MyClass
def show_var
puts @var
end
end
my_instance = MyClass.new
my_instance.var = "value"
my_subclass_instance = MySubclass.new
my_subclass_instance.show_var # 输出 "value"
3、Private access level(私有访问级别)
Private access level 是最低的访问级别,表示成员变量或方法只能从该类的代码访问。在 Ruby 中,使用 private 关键字来表示 private access level。
ruby
class MyClass
private
attr_accessor :var
end
class MySubclass < MyClass
def show_var
puts @var
end
end
my_instance = MyClass.new
my_instance.var = "value"