gpt4 book ai didi

ruby-on-rails - Ruby Integer()、Array() 等——它们是什么?他们来自哪里?

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:31 25 4
gpt4 key购买 nike

我有时遇到过 Array(value)、String(value) 和 Integer(value) 形式的转换。在我看来,这些只是调用相应的 value.to_a、value.to_s 或 value.to_i 方法的语法糖。

所以我想知道:

  • 这些是在哪里/如何定义的?我在对象、模块、类等中找不到它们
  • 是否有任何常见场景更适合使用这些而不是相应/底层的 to_X 方法?
  • 这些可以用于泛型强制转换吗?也就是说,我可以按照

    [Integer, String, Array].each {|klass| klass.do_generic_coercion(foo) }

? (...不,我真的不想那样做;我知道我想要的类型,但我希望避免使用 case 语句。)

最佳答案

这是一个很好但很难的问题。让我们来回答这三个部分。

第一部分

要找到定义,重要的是要意识到方法的名称是“Array”等,这可能非常违反直觉,因为方法通常是小写的...

irb> method(:Array)
=> #<Method: Object(Kernel)#Array>

这告诉您这些是在内核中定义的,因此无需显式前缀即可在任何地方使用。

第二部分

Array(), String(),...都是转换方法。调用 obj.to_a 将返回一个数组,但如果 obj 不 respond_to? :to_a。因此,典型情况下您更喜欢使用 Array()String(),而不是 to_ato_s 是当您不确定对象是否响应给定的转换方法时。

String(obj) 将返回 nil 如果 obj 不 respond_to? :to_s。 String(obj) 也会检查 to_s 的结果是否真的是一个字符串;应该是,但也许一个过于有创意的程序员决定返回其他东西?

大多数其他转换方法的作用相同,但 Array(obj) 不同。它会返回 [obj] 如果 obj 没有 respond_to? :to_a。它实际上会调用to_ary(这是隐式转换操作,而to_a是显式转换操作)。

在 1.9(和即将发布的 1.8.8)中还有另一种重要的对象转换方法:Array.try_convert(obj)。如果 obj 没有 respond_to? 返回 nil :to_ary。它不会调用 to_a。虽然它们的输入时间较长,但在编写可能接受不同类型的对象并希望避免错误地将散列转换为数组的非常通用的代码时,您可能更喜欢使用它们,例如(因为 Hash 具有to_a 方法但不是 to_ary)。当您的方法需要类似数组的对象并且您愿意进行显式转换时,obj.to_a 就可以了。 Array(obj) 的典型用法是在接受单个 obj 或对象列表的方法中(尽管通常写为 [*obj]).

最后一部分

希望前两部分的答案能给您最终的答案...

您可以使用:

[Integer, String, Array].each {|klass| klass.try_convert(foo) }

[:Integer, :String, :Array].each{|method| send(method, obj)}

关于ruby-on-rails - Ruby Integer()、Array() 等——它们是什么?他们来自哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2039343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com