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 工作模式使用案例之(发布订阅模式、路由模式、通配符模式)
分布式·rabbitmq·ruby
Agnoni5 天前
RabbitMQ消息队列的笔记
java·笔记·spring cloud·rabbitmq·ruby
飞的肖6 天前
RabbitMQ 安装、配置和使用介绍 使用前端js直接调用方式
开发语言·javascript·ruby
破局缘6 天前
apt文件问题ruby.list文件
开发语言·windows·ruby
Elastic 中国社区官方博客9 天前
如何将你的 Ruby 应用程序从 OpenSearch 迁移到 Elasticsearch
大数据·开发语言·数据库·后端·elasticsearch·搜索引擎·ruby
PGCCC10 天前
【PGCCC】 pg_query 6.0:使用 Postgres 自己的解析器解析、反解析和规范化 SQL 查询的 Ruby 库
数据库·sql·ruby
爱lv行10 天前
使用 rbenv 切换 Ruby 版本
开发语言·前端·ruby
信徒_12 天前
Rabbitmq 镜像队列
分布式·rabbitmq·ruby
姜西西_15 天前
RabbitMQ核心概念及工作流程 + AMQP
分布式·rabbitmq·ruby
小熊哦呜15 天前
RabbitMQ延时队列
开发语言·后端·ruby