Ruby 依赖于其他参数的参数的可选性
我想定义一个具有以下签名的方法:Ruby 依赖于其他参数的参数的可选性,ruby,Ruby,我想定义一个具有以下签名的方法: a名称是必需的 b全天是可选的 c开始时间 d结束时间是必需的,除非全天为真 e位置是可选的,是一个如下所示的哈希: location = {name => "Chelsea Piers", address => "10th Avenue", city => "New York"} 需要使用location[:name],其他键是可选的 这是我的代码: class Event def initialize(name, all_day=
- a<代码>名称是必需的
- b<代码>全天是可选的
- c<需要代码>开始时间
- d<代码>结束时间是必需的,除非
为全天
真
- e<代码>位置是可选的,是一个如下所示的哈希:
需要使用location = {name => "Chelsea Piers", address => "10th Avenue", city => "New York"}
,其他键是可选的location[:name]
class Event
def initialize(name, all_day=false, start_time, end_time, **location)
@name = name
@all_day = all_day
@start_time = Time.parse(start_time)
@end_time = Time.parse(end_time)
@location = location
end
end
我如何实现需求d。?如果全天
为真
且我没有位置
,则以下代码中该参数的语法是:
Event.new(name, true, start_time, location)
对吗?我是否可以创建一个新的事件对象,如下所示:
Event.new(name, false, start_time, end_time)
旁注:
不是有效的ruby对象。可能是:
location = {name: "Chelsea Piers",
address: "10th Avenue",
city: "New York"}
或:
旁注2:
有一个XY问题:实际上您根本不需要全天
参数。它可以从是否设置了end\u time
得出
最后,命名参数和双splat参数location
可能是混合的。总结如下:
class Event
def initialize(name, start_time, end_time = nil, location_name:, **location)
@name = name
@all_day = !end_time.nil?
@start_time = Time.parse(start_time)
@end_time = Time.parse(end_time) if end_time
@location = location.merge(name: location_name)
end
end
旁注:
不是有效的ruby对象。可能是:
location = {name: "Chelsea Piers",
address: "10th Avenue",
city: "New York"}
或:
旁注2:
有一个XY问题:实际上您根本不需要全天
参数。它可以从是否设置了end\u time
得出
最后,命名参数和双splat参数location
可能是混合的。总结如下:
class Event
def initialize(name, start_time, end_time = nil, location_name:, **location)
@name = name
@all_day = !end_time.nil?
@start_time = Time.parse(start_time)
@end_time = Time.parse(end_time) if end_time
@location = location.merge(name: location_name)
end
end
您是否考虑过将所有可选内容移动到命名参数?您最终会手动验证参数,并提出自己的ArgumentError
,但一切都不会那么混乱,也更容易阅读。我发现,如果位置参数多于两个,那么它们会变得丑陋,当你开始抛出可选参数时,情况会更糟。我不知道命名参数。非常感谢您提供的信息!!您是否考虑过将所有可选内容移动到命名参数?您最终会手动验证参数,并提出自己的ArgumentError
,但一切都不会那么混乱,也更容易阅读。我发现,如果位置参数多于两个,那么它们会变得丑陋,当你开始抛出可选参数时,情况会更糟。我不知道命名参数。非常感谢您提供的信息!!这个问题说,location
是可选的,但是location[:name]
是必需的,这无条件地没有意义(没有前者,就不能有后者)。所以我解释说OP意味着后者是必须的,如果前者是给定的。@sawa那么它可以通过内部检查来完成,比如location.empty?|位置[:名称]
仅限;如果这是真的,OP可能会忽略此答案中的location\u name
参数部分。感谢您的帮助!在这种情况下,可以用位置参数代替关键字参数吗?明白了。非常感谢。这个问题说,location
是可选的,但是location[:name]
是必需的,这无条件地没有意义(没有前者,就不能有后者)。所以我解释说OP意味着后者是必须的,如果前者是给定的。@sawa那么它可以通过内部检查来完成,比如location.empty?|位置[:名称]
仅限;如果这是真的,OP可能会忽略此答案中的location\u name
参数部分。感谢您的帮助!在这种情况下,可以用位置参数代替关键字参数吗?明白了。非常感谢。