Код хорошо работает в 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, gender, mother_name, spouse_name)

    person = Person.new(person_name, gender, 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, gender, mother_name, spouse_name|
    family.add_member(name, gender, mother_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 в строках 23 а также 25 если я удалю **kwargs затем программа запускается и дает желаемый результат в версии 2.6.3. Так почему так происходит?

1 ответ

Решение

Да - удаление обоих **kwargs in wrapper_function заставит его работать как в 2.6.x, так и в 2.7.x

Это связано с тем, что Ruby 2.7 не поддерживает автоматическое преобразование хеша в аргументы ключевого слова.

Другие вопросы по тегам