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"
相关推荐
逆境不可逃3 天前
一篇速通RabbitMQ (从入门到生产实战:核心原理、高级特性与 Spring Boot 集成全解)
开发语言·后端·ruby
亿牛云爬虫专家6 天前
业务实战:基于 Ruby Mechanize 与隧道代理构建工业级数据采集器
ruby·爬虫代理·session·隧道代理·数据采集器·mechanize·dom 表单
xuefeiniao8 天前
使用宝塔安装RabbitMQ,启动不起来
分布式·rabbitmq·ruby
yaoyouzhong8 天前
RabbitMQ HAProxy 负载均衡
rabbitmq·负载均衡·ruby
gududexiao8 天前
RabbitMQ 的介绍与使用
分布式·rabbitmq·ruby
iOS妖狐小北8 天前
RabbitMQ之交换机
分布式·rabbitmq·ruby
weyyhdke8 天前
RabbitMQ 集群部署方案
分布式·rabbitmq·ruby
lzqk120008 天前
RabbitMQ 客户端 连接、发送、接收处理消息
分布式·rabbitmq·ruby
hINs IONN10 天前
RabbitMQ HAProxy 负载均衡
rabbitmq·负载均衡·ruby