泛型类型转换
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
我正在尝试创建一种方法,该方法从用户那里获取输入并将其转换为指定类型。有没有一种方法可以做到这一点而无需为每种类型重写。
像这样:
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