泛型类型转换

Generic type convertion

我正在尝试创建一种方法,该方法从用户那里获取输入并将其转换为指定类型。有没有一种方法可以做到这一点而无需为每种类型重写。

像这样:

struct Input(InputType)
    def self.get_from_stdin(msg_fail : String = "Error! Wrong type, please reenter: ")
        input = gets
        begin
            input = input.to_s.to(InputType)
        rescue
            puts msg_fail
            input = Input(InputType).get_from_stdin
        end
        input
    end
end

age = Input(Int32).get_from_stdin("Age must be a number, please reenter: ")

基本上,我想实现类似于此的目标:

foo = foo.to(MyType)

我想如果没有宏,这将很难做到。

真正想做什么?您正在处理的确切案例是什么?正如您已经暗示的那样,当然您不能采用任意字符串并将其转换为任何其他对象,因为那会很严重 unsafe/unsound。但是,如果我们了解您的用例,我们可以提供一些更好的建议。

我不会研究泛型或宏,而是研究减少样板文件的方法。那就是将通用代码提取到生成方法中,然后为您要处理的每种情况编写特定的方法。

def prompt_user(prompt)
  print prompt
  print ' '
  loop do
    input = gets
    if input && !input.strip.empty?
      break yield input
    else
      print "Please enter a value: "
    end
  rescue
    print "Wrong type, please reenter: "
  end
end

def prompt_int32(prompt)
  prompt_user(prompt, &.to_i32)
end

def prompt_my_thing(prompt)
  prompt_user(prompt) {|value| MyThing.parse value }
end