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.args
、self.parameters
、self.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
就像*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}]
即您只能作为位置参数访问 1
、2
,并且只能从 splat 访问 8
;同样,您只能从关键字参数访问 3
和 4
,并且只能从 doublesplat 访问 9
。
(Arup Rakshit 已经给出了通过符号访问参数的 hacky 方法 - 但请注意,这会访问所有局部变量,而不仅仅是参数。)
是否可以使用新的 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
等
错误是因为 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
就像*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}]
即您只能作为位置参数访问 1
、2
,并且只能从 splat 访问 8
;同样,您只能从关键字参数访问 3
和 4
,并且只能从 doublesplat 访问 9
。
(Arup Rakshit 已经给出了通过符号访问参数的 hacky 方法 - 但请注意,这会访问所有局部变量,而不仅仅是参数。)