

Rrubyのクラスについての質問です。以下rubyコードを作成

[code]

    puts '===================================================='
    puts '1 クラスの作成、インスタンスメソッド、ゲッター、セッター'
    puts '===================================================='
    
    class Warrior
    
        @@class_hensu
    
        @class_instance_hensu
    
        def initialize(name:, hp:, ap:)
    
    　　　　　puts 'phpでいうコンストラクタ'
    
            @name = name
            @hp = hp
            @ap = ap
            puts "#{@name}:#{@hp}:#{@ap}"
            puts @mirenai
            p @nildesu
            puts 'initialize終了'
        end
    
        #インスタンスメソッド
        def attack
            a = '攻撃！'
            puts a
            puts "#{@name}は#{@ap}のダメージを与えた"
        end
    
        # ゲッターメソッド
        def name
            @name
        end
    
        # セッターメソッド
        def name=(name)
            @name = name
        end
    
        #attr_accessorでゲッターセッターが自動で作れる
        attr_accessor :hp
    
        # ゲッター、セッターをそれぞれ省略した形で
        attr_reader :ap
        attr_writer :ap
    end
    
    yamada = Warrior.new(name: '山田', hp: 1000, ap: 1000)
    yamada.attack
    yamada.name = 'さとう'
    yamada.attack
    
    puts
    puts '============================='
    puts '2 クラスの統合'
    puts '============================='
    
    class Warrior
        def call
            voice = 'ガンガン行こうぜ!'
            puts voice
        end
    end
    
    yamada.call
    
    puts
    puts
    puts '=========================='
    puts '3 クラスメソッド'
    puts '=========================='
    
    class Warrior
    
        def self.run
            puts '大草原へ走り去った'
        end
    
        class << self
            def create_warriors(warriors)
                warriors.map do |warrior|
                    Warrior.new(warrior[:name], warrior[:hp], warrior[:ap])
                end
            end
        end
    end
    
    Warrior.run
    
    warriors_info = [
        {name: '山田', hp: 1000, ap: 1000},
        {name: 'さとう', hp:500, ap: 500}
    ]
    
    warriors = Warrior.create_warriors(warriors_info)
    warriors.each do |warrior|
        puts warrior.attack
    end
    
[/code]

上記コードを書き、ターミナルにて以下、

[code]

    ====================================================
    1 クラスの作成、インスタンスメソッド、ゲッター、セッター
    ====================================================
    phpでいうコンストラクタ
    山田:1000:1000
    
    nil
    initialize終了
    攻撃！
    山田は1000のダメージを与えた
    攻撃！
    さとうは1000のダメージを与えた
    
    =============================
    2 クラスの統合
    =============================
    ガンガン行こうぜ!
    
    ==========================
    3 クラスメソッド
    ==========================
    大草原へ走り去った
    Traceback (most recent call last):
        5: from sample06.rb:102:in `<main>'
        4: from sample06.rb:88:in `create_warriors'
        3: from sample06.rb:88:in `map'
        2: from sample06.rb:89:in `block in create_warriors'
        1: from sample06.rb:89:in `new'
    sample06.rb:14:in `initialize': wrong number of arguments (given 3, expected 0; required keywords: name, hp, ap) (ArgumentError)
    
[/code]

と表示されました。おそらく

[code]

    class << self
            def create_warriors(warriors)
                warriors.map do |warrior|
                    Warrior.new(warrior[:name], warrior[:hp], warrior[:ap])
                end
            end
        end
    
[/code]

又は

[code]

    warriors_info = [
        {name: '山田', hp: 1000, ap: 1000},
        {name: 'さとう', hp:500, ap: 500}
    ]
    
[/code]

の箇所にて引数の渡し方に問題があるのかなとは思い、調べてみたのですが改善策が見つからず、  
はまり込んでしまっている状況のため、アドバイスいただけると幸いです。よろしくお願いします。


CC BY-SA 4.0
2020-02-21T03:16:27.000
63224
2020-02-21T03:53:06.310
2020-02-21T03:39:58.903
3060
37910
question
ruby
rubyのクラスメソッドについて


ご推察の通り、newメソッドへの引数の渡し方の問題となります。

[code]

            warriors.map do |warrior|
                Warrior.new(warrior[:name], warrior[:hp], warrior[:ap])
            end
    
[/code]

の部分を以下のようにすれば動作するかと思われます。

[code]

            warriors.map do |warrior|
                 Warrior.new(name:warrior[:name], hp:warrior[:hp], ap:warrior[:ap])
            end
    
[/code]

また、「ハッシュからキーワード引数への自動変換する」というrubyの機能を用いるなら以下のような呼び出しも可能となります。

[code]

            warriors.map do |warrior|
                 Warrior.new(warrior)
            end
    
[/code]

ただし、この「ハッシュからキーワード引数への自動変換する」という機能は[Ruby 2.7
から非推奨](https://techracho.bpsinc.jp/hachi8833/2019_10_31/82588)となるという話です。ご注意ください。


CC BY-SA 4.0
2020-02-21T03:53:06.310
63227
2020-02-21T03:53:06.310
27410
63224
answer