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

这篇具有很好参考价值的文章主要介绍了Ruby中的self、作用域和可见性。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

self所指的是当前或者默认对象,是一个在程序运行中依次分配给许多对象的角色。

一、理解self、当前对象或默认对象

Ruby编程的基础之一即默认对象或当前对象,在程序中是通过关键字self来访问的。在程序运行中的每一处有且只有一个,正如读者所见作为self它有确定的特权。
在 Ruby 中,self 关键字用于引用当前对象。在不同的场合下,self 所指代的对象可能会有所不同:
1、在类方法中,self 指代的是类对象本身。例如:

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 指代的是当前实例对象。例如:

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 指代的是当前模块对象。例如

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、类变量语法、作用域和可见性

class MyClass
  @@var = "value"
end

在这个例子中,定义了一个名为 MyClass 的类,并在该类中定义了一个名为 @@var 的类变量。类变量使用 @@ 前缀来表示它们是类变量,而不是实例变量。
类变量的作用域是整个类,它们可以在类的所有方法中访问。但是,类变量的可见性受到类的封装性的限制。类的封装性是指类的内部状态只能被类自身的方法所访问,而不能被外部代码所访问。因此,类变量的可见性仅限于类的方法,而不能在类的外部访问。

三、类的三个访问级别

在 Ruby 中,对象有三个访问级别:public、protected 和 private。这些访问级别控制了对象的成员变量和方法的可见性,以保护对象的内部状态,并确保对象的封装性。

1、Public access level(公共访问级别)
Public access level 是最高的访问级别,表示成员变量或方法可以从任何代码访问,包括其他类的代码。在 Ruby 中,没有特殊的语法来表示 public access level,因为它是默认的访问级别。

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。

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。文章来源地址https://www.toymoban.com/news/detail-715885.html

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"

到了这里,关于Ruby中的self、作用域和可见性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 教你快速了解C语言中的作用域和常量

      哈喽,各位铁汁们好啊!✨今天来给大家带来的是初识 C语言 里面的 作用域 、 常量 。   这几章主要带大家简单认识-一下C语言,俗话说 没吃过猪肉,也见过猪跑。 带大家了解下C语言。可以读懂C语言的简单程序,后期会给大家详细介绍C语言。 作用域 (scope)是程序

    2024年02月09日
    浏览(36)
  • Ruby

    多数人都拥有自己不了解的能力和机会,都有可能做到未曾梦想的事情。 Ruby - Ruby 环境 - Rubygems(gem)- 开源项目 Cocoapods - rvm/rbenv Ruby 是一种面向对象的脚本语言,简单易用,功能强大。能跨平台和可移植性好等等。其实就是种脚本语言。 Mac 系统是自带 Ruby 环境的,因为

    2024年02月03日
    浏览(25)
  • Ruby模块和程序组织

    和类一样,模块是一组方法和常量的集合。 和类不同,模块没有实例,取而代之的是可以将特殊模块的功能添加到一个类或者指定对象之中。 Class类是Module类的一个子类,因此每一个类对象也是一个模块对象 编写一个模块和编写类差不多,只是用module在定义开始的位

    2024年02月07日
    浏览(35)
  • 当 Tubi 遇到 Ruby

    有人说 Tubi 作为 RubyConf China 金牌赞助商,明明用极具吸引力的 Elixir 后端工程师岗位和高品质的 Elixir Meetup,“拐走了”一批又一批 Rubyist 投身于 Elixir 开发中,却依然让人想在 Tubi 展台前多停留一会儿。 为什么工程师、校友甚至 Ruby 社区颇具影响力的人物都愿意来为 Tubi 站

    2024年02月11日
    浏览(33)
  • Ruby使用类组织对象

    使用Object.new创建新对象,但是一次只使用一种方法,这是感受以对象为中心的Ruby编程的最佳方式之一。不过这种方式并不能很好地扩展,假如有一个正在运行地在线售票网站,然后其数据库必须处理数以百计地售票记录,那么可以在Ruby程序中寻找另外地一种方式去创建和操

    2024年02月07日
    浏览(35)
  • Ruby 趣学笔记(一)

    本文写于 2020 年 5 月 6 日 Ruby 趣学笔记(一) 变量 变量声明 变量类型 常量 输出 字符串 字符串操作 Array 数组的遍历 数组的连接 怎么判断该变量是否是数组 函数 普通函数 传参的函数 解包参数 部分参数解包 参数的默认值 传入一个散列 class class 下面有啥方法? 如何判断这

    2024年01月20日
    浏览(37)
  • ruby调试

    如果下载 ruby-debug-ide gem install ruby-debug-ide vscode 下载 ruby扩展 1, ruby 2,修改launch.json

    2024年02月14日
    浏览(38)
  • Ruby和面向对象技术

    Ruby和许多极为流行的编程语言都是面向对象的。多数的面向对象编程语言,每个对象都是一个样例或者既定类的实例以及独立对象的行为。 创建一个通用对象 定义通用对象的行为 定义带参数的方法 任何方法的返回值与方法执行中最后一个表达式的计算值相等 Ruby提供了一个

    2024年02月07日
    浏览(32)
  • ruby注释

    在Ruby中,可以使用以下两种方式进行注释: 1. 单行注释:使用井号(#)在代码行的开头添加注释。例如: 2. 多行注释:使用=begin和=end将多行注释括起来。例如:   注意,注释只是用于代码的解释和说明,不会被编译或执行。它们对于提高代码的可读性和可维护性非常有用

    2024年02月12日
    浏览(29)
  • CentOS安装Ruby环境

    https://github.com/rbenv/rbenv 重启bash后继续执行: Ruby安装位置: ~/.rbenv/versions/RUBY_VERSION/

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包