Rails可选参数

Aks*_*hat 47 ruby ruby-on-rails

我上课了

class Person
    attr_accessor :name,:age
    def initialize(name,age)
        @name = name
        @age = age
    end
end
Run Code Online (Sandbox Code Playgroud)

我想使年龄可选,所以如果没有通过它的0,或者如果不通过则该名称为空白

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

Ser*_*sev 100

这很简单:

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')
Run Code Online (Sandbox Code Playgroud)

但是,如果你只想传递年龄,那么调用看起来会非常难看,因为你必须为name提供空字符串:

Person.new('', 20)
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,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')
Run Code Online (Sandbox Code Playgroud)

您可以先放置一些必需的参数,然后将所有可选参数推入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)
Run Code Online (Sandbox Code Playgroud)

  • 只有ruby 2.0和RubyMotion项目才允许使用命名参数!;]不仅仅是红宝石2.0 (2认同)

bod*_*ous 7

如果你想让两个参数都是可选的,但是在nil时也设置默认值,那么你可以选择:

班级人员

def initialize(name = nil, age = 0)
  @name ||= "Default name"
  @age = age
end
Run Code Online (Sandbox Code Playgroud)

结束

这就克服了传递nil作为第一个选项但仍然获得可用默认值的问题.

@person = Person.new nil, 30
@person.name # => "Default name"
@person.age # => 30
Run Code Online (Sandbox Code Playgroud)