Подтвердить что ты не робот

Необязательный аргумент Rails

У меня есть класс

class Person
    attr_accessor :name,:age
    def initialize(name,age)
        @name = name
        @age = age
    end
end

Я бы хотел, чтобы возраст был необязательным, поэтому его значение 0, если оно не прошло, или имя должно быть пустым, если не прошло

Ive немного поработал над этим, но немного сбив с толку то, что я нашел (нужно передать переменные в другую переменную {}).

4b9b3361

Ответ 1

Это так просто:

class Person
    attr_accessor :name, :age

    def initialize(name = '', age = 0)
        self.name = name
        self.age = age
    end
end


Person.new('Ivan', 20)
Person.new('Ivan')

Однако, если вы хотите пройти только возраст, вызов будет выглядеть довольно уродливым, потому что вы все равно должны указывать пустую строку для имени:

Person.new('', 20)

Чтобы избежать этого, в мире Ruby существует идиоматический способ: параметры.

class Person
    attr_accessor :name, :age

    def initialize(options = {})
        self.name = options[:name] || ''
        self.age = options[:age] || 0
    end
end

Person.new(name: 'Ivan', age: 20)
Person.new(age: 20)
Person.new(name: 'Ivan')

Сначала вы можете поместить некоторые требуемые параметры и вставить все необязательные в options.

Изменить

Похоже, что Ruby 2.0 будет поддерживать настоящие именованные аргументы.

def example(foo: 0, bar: 1, grill: "pork chops")
  puts "foo is #{foo}, bar is #{bar}, and grill is #{grill}"
end

# Note that -foo is omitted and -grill precedes -bar
example(grill: "lamb kebab", bar: 3.14)

Ответ 2

Если вы хотите, чтобы оба аргумента были необязательными, но также задавали значения по умолчанию, когда nil, вы можете пойти с:

class Person

def initialize(name = nil, age = 0)
  @name ||= "Default name"
  @age = age
end

конец

Это связано с проблемой передачи nil в качестве первого параметра, но все еще получающего полезное значение по умолчанию.

@person = Person.new nil, 30
@person.name # => "Default name"
@person.age # => 30

Ответ 3

Это больше похоже на Ruby. Вы можете определить необязательные аргументы для метода, подобного этому:

def initialize(name="", age=0)
  @name = name
  @age = age
end

Выполняя это, вы сможете вызвать Person.new, а затем по умолчанию указать пустую строку, если она не передана, а возраст по умолчанию равен 0. Если вы хотите, чтобы возраст был чем-то, а имя было пустым, вы В любом случае вам нужно передать пустую строку:

Person.new("", 24)

Ответ 4

Используйте хэш для ruby ​​1.8/1.9 следующим образом:

def myMethod(options={})
  @email = options[:email]
  @phone = options[:phone]
end

# sample usage
myMethod({:email => "[email protected]", :phone => "0098-511-12345678"})

Также на ruby ​​2.0/2.1 вы можете использовать аргументы ключевого слова следующим образом:

def myMethod(email: '[email protected]', phone: '0098-000-00000000')
  @email = email
  @phone = phone
end

# sample usage
myMethod(email: "[email protected]", phone: "0098-511-12345678")