Rails необязательный аргумент - PullRequest
44 голосов
/ 15 марта 2012

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

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

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

Ответы [ 4 ]

95 голосов
/ 15 марта 2012

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

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 есть идиоматический способ: options параметр.

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)
7 голосов
/ 15 марта 2012

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

класс персонажа

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
4 голосов
/ 15 марта 2012

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

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

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

Person.new("", 24)
2 голосов
/ 28 сентября 2015

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

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

# sample usage
myMethod({:email => "example@email.ir", :phone => "0098-511-12345678"})

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

def myMethod(email: 'default@email.ir', phone: '0098-000-00000000')
  @email = email
  @phone = phone
end

# sample usage
myMethod(email: "example@email.ir", phone: "0098-511-12345678")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...