首页 > 解决方案 > 扎实的 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]

标签: rubyargumentsparameter-passing

解决方案


options不是可选参数,因为在没有该参数的情况下初始化 Person 对象会引发ArgumentError错误,因为它需要一个参数但您没有传递任何参数:

Person.new
# file.rb:4:in `initialize': wrong number of arguments (given 0, expected 1) (ArgumentError)

在这种情况下options,它意味着是一个散列或任何响应该方法的对象[]。因此,如果您使用包含符号 key 的哈希初始化 Person 对象ageself.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}>

推荐阅读