我有一个班级
class Person
attr_accessor :name,:age
def initialize(name,age)
@name = name
@age = age
end
end
我想将年龄设为可选,如果未通过则为0,或者如果未通过,则为空白
我已经对它进行了一些研究,但它对于我发现的东西(必须在另一个变量{}中传递变量)有点混乱。
答案 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")