是否可以使用新的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.args
,self.parameters
,self.options
等
答案 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
答案 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}]
即。您只能作为位置参数访问1
,2
,而只能从splat访问8
;以同样的方式,您只能从关键字参数访问3
和4
,而只能从双打平台访问9
。
(Arup Rakshit已经提供了通过符号访问参数的hacky方法 - 但请注意,这会访问所有局部变量,而不仅仅是参数。)
答案 2 :(得分:0)
错误是因为next
是一个Ruby关键字。选择其他名称,应该没问题。