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"
相关推荐
Yvemil76 小时前
MQ 架构设计原理与消息中间件详解(二)
开发语言·后端·ruby
一丝晨光8 小时前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
Yvemil713 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
鸡c14 小时前
rabbitMq------客户端模块
分布式·rabbitmq·ruby
wclass-zhengge2 天前
RabbbitMQ篇(环境搭建 - 下载 & 安装)(持续更新迭代)
开发语言·后端·ruby
课堂随想3 天前
【git】配置 Git 的换行符处理和安全性||安装 Ruby
git·ruby
我的运维人生5 天前
MacOS升级Ruby版本详解:步骤、挑战与解决方案
开发语言·macos·ruby·运维开发·技术共享
Jet-W8 天前
Ruby基础语法
开发语言·后端·ruby
不能再留遗憾了9 天前
RabbitMQ 高级特性——重试机制
分布式·rabbitmq·ruby
小白学大数据10 天前
使用Ruby进行视频内容的自动化分析
开发语言·自动化·音视频·ruby