使用具有默认值的哈希初始化ruby对象?

使用具有默认值的哈希初始化ruby对象?,ruby,Ruby,我试图找出如何在初始化方法中为哈希键分配默认值。我已经使用helper方法来指定日期,但是我相信必须有一种更有效的方法来避免使用单独的helper方法。任何想法都很感激 def initialize(details) @name = details[:name] @age = details[:age] @admission_date = get_date(details) end def get_date(details) if details[:date].nil?

我试图找出如何在初始化方法中为哈希键分配默认值。我已经使用helper方法来指定日期,但是我相信必须有一种更有效的方法来避免使用单独的helper方法。任何想法都很感激

def initialize(details)
  @name = details[:name]
  @age = details[:age]
  @admission_date = get_date(details)
end

def get_date(details)
  if details[:date].nil?
    @admission_date = Date.today.strftime("%d%m%y")
  else
    @admission_date = details[:date]
  end
end

哦,我现在明白了,您可以使用or符号,它将返回第一个真实值:

require 'date'

details1={name:"Will", age:19}
details2={name:"Will", age:19, date:'has_date'}

class Test
  attr_reader :admission_date, :age, :name
def initialize(details)
  @name = details[:name]
  @age = details[:age]
  @admission_date = details[:date]||Date.today.strftime("%d%m%y")
end
end

t1=Test.new(details1)
p t1.admission_date #"190920"

t2=Test.new(details2)
p t2.admission_date #"has_date"


哦,我现在明白了,您可以使用or符号,它将返回第一个真实值:

require 'date'

details1={name:"Will", age:19}
details2={name:"Will", age:19, date:'has_date'}

class Test
  attr_reader :admission_date, :age, :name
def initialize(details)
  @name = details[:name]
  @age = details[:age]
  @admission_date = details[:date]||Date.today.strftime("%d%m%y")
end
end

t1=Test.new(details1)
p t1.admission_date #"190920"

t2=Test.new(details2)
p t2.admission_date #"has_date"


您正在查找关键字参数:

class Thing
  def initialize(date: Date.today.strftime("%d%m%y"), **details)
    @name = details[:name]
    @age = details[:age]
    @admission_date = date
  end
end
双splat(
**
)将剩余的关键字参数收集到一个散列中

您还可以通过省略默认值来创建非可选参数:

class Thing
  def initialize(name:, date: Date.today.strftime("%d%m%y"), **details)
    @name = name
    @age = details[:age]
    @admission_date = date
  end
end

您正在查找关键字参数:

class Thing
  def initialize(date: Date.today.strftime("%d%m%y"), **details)
    @name = details[:name]
    @age = details[:age]
    @admission_date = date
  end
end
双splat(
**
)将剩余的关键字参数收集到一个散列中

您还可以通过省略默认值来创建非可选参数:

class Thing
  def initialize(name:, date: Date.today.strftime("%d%m%y"), **details)
    @name = name
    @age = details[:age]
    @admission_date = date
  end
end

在Ruby中,条件表达式是一个表达式,这意味着它的计算结果是一个值。(在Ruby中,所有内容都是一个表达式,没有语句,因此,所有内容的计算结果都是一个值。)条件表达式的值是执行的分支的值

所以,无论你在哪里看到这样的东西:

如果foo
酒吧(巴兹)
其他的
酒吧
结束
你总是可以用

条(
若富
巴兹
其他的
库克斯
结束
)
#更习惯地写为
条形图(如果为foo,则为baz,否则为qux端)
到处都可以看到这样的东西:

如果foo
bar=baz
其他的
bar=qux
结束
你总是可以用

bar=if foo
巴兹
其他的
库克斯
结束
那么,让我们在这里这样做:

def get_日期(详细信息)
@入学日期=如果详细信息[:日期]。无?
日期.今天.标准时间(“%d%m%y”)
其他的
详情[:日期]
结束
结束
让我们进一步了解一下:您的
get\u date
方法非常奇怪。它执行副作用(分配给
@admission\u date
),但也返回一个值。通常,方法要么执行副作用(并且不返回任何内容,即在Ruby
nil
中),要么返回某些内容,但不能同时返回两者

另外,一个名为
get
something的方法实际上正在设置一些东西,这一事实令人难以置信地混淆和误导,而混淆和误导的方法名称是非常危险的,因为它们会导致错误,程序员认为该方法在做一件事,但实际上却在做另一件事

一、 就我个人而言,我根本不认为调用名为
get
something的方法是不安全的。但是这个方法是不安全的:如果我调用它只是为了检查当前日期是什么(毕竟,它被称为
get_date
,那么它除了获取日期之外还能做什么呢),我实际上会覆盖
@admission_date
的值

然而,更奇怪的是,该方法的使用方式:尽管该方法在调用时已经分配了实例变量
@admission\u date
,但该方法的返回值(即分配给
@admission\u date
的值)再次用于分配
@admission\u date
,因此,它会立即被覆盖,覆盖值与它已有的值完全相同

很明显,即使是代码的作者也被方法的名称所迷惑和误导!方法名称是如此误导,以至于作者甚至没有看到双重赋值,尽管事实上这两个赋值在5行之内

那么,让我们删除一个多余的任务。我更愿意删除
get_date
方法中的一个,以使其行为与其名称更加一致:

def get_日期(详细信息)
如果详细信息[:日期].nil?
日期.今天.标准时间(“%d%m%y”)
其他的
详情[:日期]
结束
结束
此外,它看起来像
details[:date]
可以是
nil
date
,但它永远不能是
false
,并且
nil
不是有效值。因此,我们可以在这里使用著名的
|
成语:

def get_日期(详细信息)
详细信息[:date]| | date.today.strftime(“%d%m%y”)
结束
或者,也许更好,我们可以使用
Hash#fetch

def get_日期(详细信息)
details.fetch(:date,date.today.strftime(“%d%m%y”))
结束
由于您的helper方法此时并没有真正执行任何复杂的操作,并且只从代码中的一个位置调用,因此我们可以直接内联它:

def初始化(详细信息)
@名称=详细信息[:名称]
@年龄=详细信息[:年龄]
@入院日期=详细信息.fetch(:date,date.today.strftime(“%d%m%y”))
结束
请注意,自从Ruby 2.0(2013年Ruby 20岁生日时发布)以来,Ruby支持关键字参数,包括带有默认参数值的强制关键字参数和可选关键字参数,因此编写此文件的更好方法可能是:

def初始化(名称:,年龄:,日期:日期。今天。strftime(“%d%m%y”))
@姓名、@age、@date=姓名、年龄、日期
结束

但这取决于API设计和调用方。

在Ruby中,条件表达式是一个表达式,这意味着它的计算结果是一个值。(在Ruby中,所有内容都是一个表达式,没有语句,因此,所有内容的计算结果都是一个值。)条件表达式的值是执行的分支的值

所以,无论你在哪里看到这样的东西:

如果foo
酒吧(巴兹)
其他的
酒吧
结束
你总是可以用

条(
若富
巴兹
其他的
库克斯
结束
)
#更习惯地写为
条形图(如果为foo,则为baz,否则为qux端)
到处都可以看到这样的东西:

如果foo
bar=baz
其他的
bar=qux
结束
你总是可以用

bar=if foo
巴兹
其他的
库克斯
结束