私のすべての配列をループして、私のjson idの値を真のメソッドを渡すものと比較しようとしています。私はそれをしようとする場合でも、私はエラーを取得する:インスタンス変数でそれぞれを使用するとエラーが発生する
undefined method 'each' for nil:NilClass
heroe.rb
require 'json'
class Hero
attr_accessor :hp
json = File.read('skill_list.json')
@skills = JSON.parse(json)
def initialize(name, level, job, hp, strength)
@name = name
@level = level.to_i
@job = job
@hp = hp.to_i
@strength = strength.to_i
end
def get_name
@name
end
def profile
puts "#{@name} level is #{@level} and hp: #{@hp}"
end
def attack(id)
@skills.each do |s|
if s['id'] == id
puts true
else
puts false
end
end
end
def get_hp
puts @hp
end
end
skill_list.json
[
{
"id": 0,
"name": "Double Slash",
"element": "fighter",
"amp": 1.1,
"mp": 1
}, {
"id": 1,
"name": "Slash",
"element": "fighter",
"amp": 1,
"mp": 1
}, {
"id": 2,
"name": "Falling Ashes",
"element": "psychic",
"amp": 1,
"mp": 1
}
]
その後、私は攻撃を持つオブジェクトと呼ばれます方法:hero.attack(1)
私はちょっとここに詰まっていますpは高く評価されます〜
ありがとうございました!これはうまくいった! || =何を意味するのか説明できますか?初めて私はこれをルビーで見たことがあります。 – Blinhawk
'x || = y'は' x = x ||と同じです。 'x'がすでに非*論理的 - 偽*値でない限り' 'y''を' 'x 'に割り当てるのが便利な方法です。つまり、 'x'が既に初期化されていない場合にのみ' x'を初期化します。これは、ブロックが1回だけ実行されることを意図しているため、「遅延ロード」と呼ばれます。スレッドが関与している場合、これは難解ですが、自動ロックを使用して同じ原則を適用することができます。 – tadman
'&& ='のような変種もありますが、これも同じ拡張の原則を使って動作しますが、珍しいことに、 'x'に割り当てたいのは、すでに割り当てられている場合のみです。プロダクションコードを参照してください。 '+ ='、 ' - ='、 '* ='と '/ ='がより一般的ですが、 'x + = 1'は' x = x + 1'と同じです。 – tadman