Ruby 关键字作为命名哈希参数

Ruby keyword as named hash parameter

是否可以使用新的 ruby 2.0 语法访问包含关键字参数的散列?

class List::Node
  attr_accessor :data, :next
  def initialize data: nil, next: nil
    self.data = data
    self.next = next # ERROR! 
  end
end

旧语法工作正常:

class List::Node
  attr_accessor :data, :next
  def initialize options = { data: nil, next: nil }
    self.data = options[:data]
    self.next = options[:next] 
  end
end

----- 编辑 -----

我知道 next 是一个保留字,但我猜关键字属性存储在内部哈希中,我想知道是否可以访问它,例如通过 self.argsself.parametersself.options

错误是因为 next 一个 Ruby 关键字。换个名字应该没问题。

这会起作用:

class List::Node
  attr_accessor :data, :next
  def initialize data: nil, _next: nil
    self.data = data
    self.next = _next
  end
end

next 是 Ruby 保留字。使用不是 Ruby 的保留关键字的名称。

编辑:是的,可能,但不是一个好主意。

class List::Node
  attr_accessor :data, :next
  def initialize data: nil, next: nil
    self.data = data
    self.next = binding.local_variable_get(:next)
  end
end
p List::Node.new.next # nil

local_variable_get.

就像*args收集所有你没有在参数列表中提到的位置参数一样,**kwargs收集你[=]的所有关键字参数25=]没有在参数列表中提到。据我所知,没有非 hacky 方法可以同时从声明的参数和 splat 访问位置参数,关键字参数也是如此。

def foo(pos1, pos2, *args, reqkw:, optkw: nil, **kwargs)
  puts [pos1, pos2, reqkw, optkw, args, kwargs].inspect
end
foo(1, 2, 8, reqkw: 3, optkw: 4, extkw: 9)
# => [1, 2, 3, 4, [8], {:extkw=>9}]

即您只能作为位置参数访问 12,并且只能从 splat 访问 8;同样,您只能从关键字参数访问 34,并且只能从 doublesplat 访问 9

(Arup Rakshit 已经给出了通过符号访问参数的 hacky 方法 - 但请注意,这会访问所有局部变量,而不仅仅是参数。)