Ruby中的self、作用域和可见性

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"
相关推荐
江河湖海2 天前
用Ruby编写一个自动化测试脚本,验证网站登录功能的正确性。
开发语言·后端·ruby
弥琉撒到我3 天前
docker对其他中间件镜像拉取多个服务器部署
开发语言·后端·ruby
玄天灵4 天前
RabbitMQ
分布式·rabbitmq·ruby
阑梦清川6 天前
RabbitMQ介绍和快速上手案例
分布式·rabbitmq·ruby
菜鸟分享录6 天前
RabbitMQ教程:工作队列(Work Queues)(二)
分布式·rabbitmq·ruby
落落落sss7 天前
MQ集群
java·服务器·开发语言·后端·elasticsearch·adb·ruby
编码小袁8 天前
Ruby编程语言全景解析:从基础到进阶
java·前端·ruby
Yanbin_Q9 天前
Vagrant 没了 VirtualBox 的话可以配 Qemu
运维·ruby·vagrant
TomSmile_WorkSpace9 天前
RabbitMq项目实战--延迟队列实现超时订单处理
开发语言·后端·ruby
P.H. Infinity9 天前
【RabbitMQ】06-消费者的可靠性
分布式·rabbitmq·ruby