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
参数部分。感谢您的帮助!在这种情况下,可以用位置参数代替关键字参数吗?明白了。非常感谢。