Rails可选参数

时间:2012-03-14 21:08:51

标签: ruby-on-rails ruby

我有一个班级

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

我想将年龄设为可选,如果未通过则为0,或者如果未通过,则为空白

我已经对它进行了一些研究,但它对于我发现的东西(必须在另一个变量{}中传递变量)有点混乱。

4 个答案:

答案 0 :(得分:95)

这很简单:

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

修改

It seems 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)

答案 1 :(得分:7)

如果您希望两个参数都是可选的,但在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

答案 2 :(得分:4)

这更像是Ruby的东西。您可以为这样的方法定义可选参数

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

通过这种方式,您可以调用Person.new然后将名称默认为空白字符串,如果它未通过且年龄默认为0.如果您希望年龄是某些东西,但名称是空白你无论如何都需要传递一个空字符串:

Person.new("", 24)

答案 3 :(得分:2)

使用hash for 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")