使用具有默认值的哈希初始化ruby对象?
我试图找出如何在初始化方法中为哈希键分配默认值。我已经使用helper方法来指定日期,但是我相信必须有一种更有效的方法来避免使用单独的helper方法。任何想法都很感激使用具有默认值的哈希初始化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?
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
),但也返回一个值。通常,方法要么执行副作用(并且不返回任何内容,即在Rubynil
中),要么返回某些内容,但不能同时返回两者
另外,一个名为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
巴兹
其他的
库克斯
结束