Rails可选参数

我有一堂课

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

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

我研究了一下,但它有点混淆,我发现(不得不传递variables在另一个variables{})。

这很简单:

 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') 

但是,如果您只想传递年龄,则调用看起来非常难看,因为您必须为名称提供空string:

 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) 

如果你希望这两个参数是可选的,但也设置默认值时,你可以去:

上课人

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

结束

这就解决了作为第一个选项通过零的问题,但仍然得到一个可用的默认值。

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

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

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

通过这样做,您将能够调用Person.new ,然后将名称默认为空白string,如果它没有通过,并将年龄默认为0.如果你想要年龄是一些东西,但名称是空白的,你需要无论如何传递一个空string:

 Person.new("", 24) 

使用散列ruby1.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")