基础良好的Rubyist语法问题可选参数或散列参数

基础良好的Rubyist语法问题可选参数或散列参数,ruby,arguments,parameter-passing,Ruby,Arguments,Parameter Passing,我目前正在阅读“基础扎实的红宝石第二版”,我在第296页,并得到了以下代码 class Person attr_accessor :age def initialize(options) self.age = options[:age] end def teenager? (13..19) === age end end 选项[:年龄]指的是什么? 这是一个可选的论点还是什么? 如果我在写那个类,我会像@age=options 编辑-我忘了提到,我确实发

我目前正在阅读“基础扎实的红宝石第二版”,我在第296页,并得到了以下代码

class Person
  attr_accessor :age

  def initialize(options)
    self.age = options[:age]
  end

  def teenager?
    (13..19) === age
  end
end
选项[:年龄]
指的是什么? 这是一个可选的论点还是什么? 如果我在写那个类,我会像
@age=options


编辑-我忘了提到,我确实发现了这个问题-使用了书中使用的行。但是我不明白为什么要用它,或者为什么
options
与符号
[:age]
一起使用

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

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

p Person.new(age: 100, another_thing: nil)
# #<Person:0x00007ff47e09aa18 @age={:age=>100, :another_thing=>nil}>
在这种情况下,
选项
意味着是一个哈希或响应方法
[]
的任何对象。因此,如果使用包含符号键
age
的哈希初始化Person对象,则
self.age
将取该值:

p Person.new(age: 100)
# <Person:0x00007ff05b84eab0 @age=100>

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

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

p Person.new(age: 100, another_thing: nil)
# #<Person:0x00007ff47e09aa18 @age={:age=>100, :another_thing=>nil}>
在这种情况下,
选项
意味着是一个哈希或响应方法
[]
的任何对象。因此,如果使用包含符号键
age
的哈希初始化Person对象,则
self.age
将取该值:

p Person.new(age: 100)
# <Person:0x00007ff05b84eab0 @age=100>

啊,我明白了。这本书确实使用了
people=10.step(25,3).map{i | Person.new(age:i)}
来实例化多个人,你可以看到选项是一个散列,就像
{age:i}
@Sebatian一样,选项散列是在什么时候创建的?散列是调用方法时使用的参数。当最后一个(或只有一个)参数是散列时,Ruby允许您省略
{}
。所以
Person.new({age:100})
Person.new(age:100)
差不多。啊,我明白了。这本书确实使用了
people=10.step(25,3).map{i | Person.new(age:i)}
来实例化多个人,你可以看到选项是一个散列,就像
{age:i}
@Sebatian一样,选项散列是在什么时候创建的?散列是调用方法时使用的参数。当最后一个(或只有一个)参数是散列时,Ruby允许您省略
{}
。因此
Person.new({age:100})
Person.new(age:100)
几乎相同。