ruby - 扎实的 Rubyist - 语法问题 - 可选参数或哈希参数
问题描述
我目前正在阅读“The Well Grounded Rubyist 2nd Edition”,我在第 296 页,并获得了以下代码
class Person
attr_accessor :age
def initialize(options)
self.age = options[:age]
end
def teenager?
(13..19) === age
end
end
options[:age]
指的是什么?它是可选参数还是什么?如果我在写那门课,我会写那行@age = options
编辑 - 我忘了提,我确实找到了这个问题 - Rails optional argument - 它使用了书中使用的行。但我无法弄清楚为什么使用它或为什么options
使用符号[:age]
。
解决方案
options
不是可选参数,因为在没有该参数的情况下初始化 Person 对象会引发ArgumentError
错误,因为它需要一个参数但您没有传递任何参数:
Person.new
# file.rb:4:in `initialize': wrong number of arguments (given 0, expected 1) (ArgumentError)
在这种情况下options
,它意味着是一个散列或任何响应该方法的对象[]
。因此,如果您使用包含符号 key 的哈希初始化 Person 对象age
,self.age
则将采用该值:
p Person.new(age: 100)
# <Person:0x00007ff05b84eab0 @age=100>
使用散列作为参数在调用方法时为您提供了灵活性,因为您可以将任何需要的对象包装到散列中,您只需要在方法定义中处理它们即可。
如果您这样做self.age = options
(或@age = options
),那么您将分配给self.age
整个选项对象,它可以是整个哈希或作为参数传递的任何内容:
def initialize(options)
self.age = options
end
...
p Person.new(age: 100, another_thing: nil)
# #<Person:0x00007ff47e09aa18 @age={:age=>100, :another_thing=>nil}>
推荐阅读
- c# - 使用实体框架搜索单个项目并将其作为数据传输对象返回?
- javascript - 通过拖动使 flexbox 侧边栏 div 宽度增加/减少
- javascript - 为什么切换图像的 url src 需要时间来“加载”反应?
- java - 如何使用弹簧休息模板将列表作为正文发送请求
- dart - 如何在颤动中转换子小部件?
- can-bus - 以can协议和dbc格式寻址?
- javascript - 我可以使用 JavaScript 对特定像素的颜色进行采样吗?
- python - How to add columns to an empty pandas dataframe?
- keystonejs - 将 Mongoose 模式验证错误识别为 HTTP 状态代码
- ruby-on-rails - 如何在 rolify 中删除范围为资源实例的角色?