如何解决代码在Ruby 2.7中运行良好,但在Ruby 2.6.3中却无法运行
我已经在Ruby 2.7中编写了具有装饰器功能的代码。它在该版本中运行良好,但是相同的代码在Ruby 2.6中无法正常工作。如果我取消对装饰器的调用,即wrapper_function
,则代码将在Ruby 2.6中执行,但这不是我想要的功能。那么我在这里的错误是什么,我该如何纠正?
已编辑
#test.rb
FAMILYTREE = {
"name": "Royal Family","members": [
[
"King","Male","no mother"
],[
"Queen","Female","no mother","King"
]
]
}
module Wrapper
def wrapper_function(func_name)
new_name_for_old_function = "#{func_name}_old".to_sym
alias_method(new_name_for_old_function,func_name)
define_method(func_name) do |*args,**kwargs|
begin
result = send(new_name_for_old_function,*args,**kwargs)
if result.instance_of?(Array) && result.any?
result.map(&:name).join(' ')
end
end
end
end
end
class Person
attr_accessor :name,:gender,:mother
def initialize(name,gender,mother_name=nil)
@name = name
@gender = gender
@mother = mother
end
end
class Family
extend Wrapper
attr_accessor :family_name,:members
def initialize(family_name)
@family_name = family_name
@members = []
end
def add_member(person_name,mother_name,spouse_name)
person = Person.new(person_name,mother_name)
members << person
end
wrapper_function(:add_member)
end
def create_family_tree(family_tree)
#Initializing the family
family_name = family_tree[:name]
members = family_tree[:members]
family = Family.new(family_name)
members.each do |name,spouse_name|
family.add_member(name,spouse_name)
end
family
end
fam = create_family_tree(FAMILYTREE)
以上是显示问题的完整文件:
要运行它:ruby test.rb
如果版本为2.7.1
,则代码将正确执行。
如果是2.6.3,则出现此错误:
test.rb:54:in add_member: wrong number of arguments (given 5,expected 4) (ArgumentError)
如果在wrapper_function
的{{1}}和23
行中删除了25
,则程序将执行并以版本**kwargs
给出所需的结果。那为什么会这样呢?
解决方法
是-删除wrapper_function中的两个**kwargs
使其可以在2.6.x和2.7.x中工作
与Ruby 2.7 deprecating automatic conversion from a hash to keyword arguments
有关版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。