Crystal:方法选项的好方法

时间:2017-01-15 12:35:39

标签: crystal-lang

我需要将一些选项传递给方法,其中一些选项是可选的(类似于JS中的Object destructuring)。

我目前的代码:

def initialize( arg1 : String, options = {} of Symbol => String )
  opt = MyClass.get_option options, :opt1
  @opt1 = !opt.empty? ? opt : "Def value"
  opt = MyClass.get_option options, :opt2
  @opt2 = !opt.empty? ? opt : "False"
  # ...
end
def self.get_option( options, key : Symbol )
  ( options && options[key]? ) ? options[key].strip : ""
end

我称之为:MyClass.new "Arg", { opt2: "True", opt4: "123" }

它有效,但我正在寻找更好的方法。设置每个选项的类型并直接在函数签名中使用默认值会很有用。

使用NamedTuple似乎是个好方法,但我遇到了可选值的问题 - options : NamedTuple( opt1: String, opt2: Bool, opt3: String, opt4: Int ) | Nil = nil

我尝试的另一种方法是使用结构但它似乎使情况复杂化。

1 个答案:

答案 0 :(得分:2)

Crystal具有可选的和命名的方法参数作为核心语言特性,并且不需要编写用于处理参数的特殊代码。请参阅有关Method arguments的官方文档。特别是,这是一个例子:

def method(arg1 : String, *, opt1 = "Def value", opt2 = false)

并不总是需要星号,它只能确保以下可选参数只能通过名称​​传递

method("test", opt1: "other value", opt2: false)