Ruby 实体变数(instance variable)

在 Ruby 里的实体变数是有一个 @ 开头的变数,顾名思义,是活在每个实体里的变数,而且每个实体之间互不相影响。

前面这个范例来说,@name 跟 @gender 就是实体变数。

在 Rails 专案中,实体变数使用的频率很高,最常用的地方应该是 Controller 与 View 之间的沟通,随便举一个 Controller 为例:

class PostsController < ApplicationController
  def index
    @posts = Post.all    # 取得所有的 Post 资料
  end
end

取用实体变数

Ruby 的实体变数没办法直接从外部取用,像这样直接取用会发生错误讯息:

kitty = Cat.new("kitty", "female")
kitty.name = "nancy"     # 这会发生错误
puts kitty.name          # 这也会发生错误

因为 Ruby 并没有「属性」(property/attribute)这样的设计,要取用实体变数,需要另外定义的方法才行:

class Cat
  def initialize(name, gender)
    @name = name
    @gender = gender
  end

  def say_hello
    puts "hello, my name is #{@name}"
  end

  def name
    @name
  end

  def name=(new_name)
    @name = new_name
  end
end

kitty = Cat.new("kitty", "female")
kitty.name = "nancy"
puts kitty.name        # => nancy

这里定义的 name 以及 name= 方法(是的,你没看错,等号 = 也是方法的一部份)就是负责回传及设定 @name 这个实体变数的。

也许你会想,每次要这样取用或设定实体变数的值都要这麽麻烦吗?还好,Ruby 有帮我们定义了三个方法来解决这件事,分别是 attr_reader、attr_writer 以及 attr_accessor。这三个方法分别会做出「读取」、「设定」以及「读取 + 设定」的方法,所以原来的有点罗嗦的写法就可使用 attr_accessor 改写成这样:

class Cat
  attr_accessor :name

  def initialize(name, gender)
    @name = name
    @gender = gender
  end

  def say_hello
    puts "hello, my name is #{@name}"
  end
end

参考资料

[为你自己学Ruby on Rails]https://railsbook.tw/chapters/08-ruby-basic-4.html


<<:  30天轻松学会unity自制游戏-制作子弹

>>:  一些类似判断是否为空的方法比较:isset, empty, is_null

[Java Day19] 4.7. 静态化

教材网址 https://coding104.blogspot.com/2021/06/java-s...

[Day25] Angular 的 Module 与 Component

昨天我们建立了一个新的 Angular 专案,然後跑了一下内建的范例程序,今天我们要来动手加入一些自...

[Day29]检视表、索引

下列是检视表(VIEW)的规则说明: 检视表中的子查询是由合并、分组即子查询等语法构成的SELECT...

【把玩Azure DevOps】Day14 Extensions for Azure DevOps:Azure DevOps也能装外挂?

许多功能强大的系统或软件都会设计有能够安装额外的扩充套件或外挂的功能,藉此延伸软件的功能应用层面,A...

云安全联盟(CSA)-安全信任和保证注册(STAR)

-图片来源:CSA 在云安全联盟(CSA)划分安全,信任和保证注册(STAR)计划分为三个层次: ...