Необязательный аргумент Rails
У меня есть класс
class Person
attr_accessor :name,:age
def initialize(name,age)
@name = name
@age = age
end
end
Я бы хотел, чтобы возраст был необязательным, поэтому его значение 0, если оно не прошло, или имя должно быть пустым, если не прошло
Ive немного поработал над этим, но немного сбив с толку то, что я нашел (нужно передать переменные в другую переменную {}).
Ответы
Ответ 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")