我有课

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

我想将年龄设置为可选的,如果未通过,则年龄为0;如果未通过,则名称为空

我对它进行了一些研究,但对于我所发现的(必须在另一个变量{}中传递变量)来说,这有点令人困惑.

推荐答案

就这么简单:

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

然而,如果你只想超过年龄,这个调用看起来会很难看,因为你必须为name提供空白字符串:

Person.new('', 20)

为了避免这种情况,Ruby world中有一种惯用的方法: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)

Ruby-on-rails相关问答推荐

为什么Rails数值验证器不使用规格化值?

`heroku Open`和`heroku run rake db:Migrate`不工作(";没有这样的文件或目录";)

Django模型在关系更新时更新相关对象

Sidekiq with Rails - 控制台与 rake 任务中的不同 Sidekiq 实例

线程如何在 Web 应用程序中工作?

在bash中匹配带有空格字符的字符串

如何在 IRB/Rails 控制台中 suppress 返回值的输出?

使用brew 软件安装了 elasticsearch,但找不到配置文件

rails, activerecord, 获取当前连接规范

在 Nokogiri 中获取属性值以提取链接 URL

是否可以在 Rails 集成测试或规范中指定用户代理?

为什么我要使用 unicorn 或 thin 而不是 WEBrick 用于开发目的?

Rails 3.1 在开发模式下非常慢,因为assets资源 ,怎么办?

在 where 查询中查找 nil has_one 关联

将图标添加到 Rails 应用程序

Rails,设计认证,CSRF 问题

在范围内传递参数

ruby/ruby on rails 内存泄漏检测

如何强制 RSpec 测试失败?

在 El Capitan 上安装 Nokogiri (1.6.7) 时出错