Вероятно, это не лучший способ организовать ваш код. Я бы порекомендовал хранить первый класс пользователя как объект, который выполняет вычисления самостоятельно. Это более объектно-ориентированный подход:
class User
def first_class= klass
@first_class = klass.new(self)
end
def first_class
@first_class
end
end
class FirstClass
attr_accessor :user
def initialize user
@user = user
end
def cost
{ :str => (user.strength_points + 1)*rate[:str],
:dex => (user.dexterity_points + 1) * rate[:dex],
:mag => (user.magic_points + 1) * rate[:mag],
:acc => (user.accuracy_points + 1) * rate[:acc],
:hp => (user.health_points + 1) * rate[:hp] }
end
end
Затем вы можете определить типы первого класса:
class Fighter < FirstClass
def rate
{:str => 2, :dex => 3, :mag => 3, :acc => 2, :hp => 2}
end
end
class Magician < FirstClass
def rate
{:str => 3, :dex => 3, :mag => 2, :acc => 2, :hp => 2}
end
end
class Ranger < FirstClass
def rate
{:str => 3, :dex => 2, :mag => 3, :acc => 2, :hp => 2}
end
end
Затем вы можете настроить свою функцию следующим образом:
user.first_class.cost
Имейте в виду, что вам также нужно установить первый класс как объект:
user.first_class = Fighter
Но я думаю, что это выглядит чище, более объектно-ориентировано и значительно снижает сложность вашего кода.