在 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
>>: 一些类似判断是否为空的方法比较:isset, empty, is_null
教材网址 https://coding104.blogspot.com/2021/06/java-s...
昨天我们建立了一个新的 Angular 专案,然後跑了一下内建的范例程序,今天我们要来动手加入一些自...
下列是检视表(VIEW)的规则说明: 检视表中的子查询是由合并、分组即子查询等语法构成的SELECT...
许多功能强大的系统或软件都会设计有能够安装额外的扩充套件或外挂的功能,藉此延伸软件的功能应用层面,A...
-图片来源:CSA 在云安全联盟(CSA)划分安全,信任和保证注册(STAR)计划分为三个层次: ...