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)
如果你想让两个参数都是可选的,但是在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)
| 归档时间: |
|
| 查看次数: |
73601 次 |
| 最近记录: |