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

时间:2015-06-01 08:38:38

标签: ruby ruby-2.0

是否可以使用新的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

3 个答案:

答案 0 :(得分:3)

这将有效:

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

答案 1 :(得分:1)

就像*args收集参数列表中没有提及的所有位置参数一样,**kwargs会收集没有<的所有关键字参数/ em>在参数列表中提及。据我所知,从声明的参数和splat同时访问位置参数没有非hacky方法,关键字参数也是如此。

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,而只能从双打平台访问9

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

答案 2 :(得分:0)

错误是因为next是一个Ruby关键字。选择其他名称,应该没问题。