0

コードは次のとおりです。

class Person
  attr_accessor :id, :name

  def initialize(init = {})
    init.each do |k, v|
      send("#{k}=", v)
    end
  end
end

people = [ 
  Person.new(:id => 1, :name => "Adam"), 
  Person.new(:id => 2), 
  nil,
]

people.map! do |person|
  person ||= Person.new(:id => 3, :name => "Some default")
  person.name ||= 'Eve'
  person
end

binding.pry

そして、これが私が詮索好きなものです:

[1] pry(main)> people
=> [#<Person:0x007fc2b0afba98 @id=1, @name="Adam">,
 #<Person:0x007fc2b0afb930 @id=2, @name="Eve">,
 #<Person:0x007fc2b0afb7f0 @id=3, @name="Some default">]
[2] pry(main)> people.first
=> #<Person:0x007fc2b0afba98 @id=1, @name="Adam">
[3] pry(main)> people.second
NoMethodError: undefined method `second' for #<Array:0x007fc2b0afb890>
from (pry):3:in `<main>'

people.secondとにアクセスできることを期待していましたpeople.second.id。調子はどう?

4

3 に答える 3

1

people[1]配列内の要素にアクセスする標準的な方法である を使用するだけです。

「active_support/core_ext」を要求すると、非常に少量の構文シュガーに相当するものに対して、おそらく必要のない多くのものが追加されます。

于 2013-05-29T18:47:20.807 に答える
0

他の回答が述べているように、この方法は Active Support からのものです。でも、ひとつのメソッドだけにActive Supportを引き込みたくないのなら……まあ、これはRubyですね。

class Array
  def second
    self[1]
  end
end

または、より一般的に:

module Enumerable
  def second
    first = true
    each { |x| first ? (first = false) : return x }
  end
end

実際にはこれらの定義の両方を含めることができ、配列の場合は、より具体的な (そしておそらくより高速な) メソッドが使用されます。他のタイプの Enumerable については、より一般的な方法が使用されます。

于 2013-05-29T18:47:15.027 に答える