Array()的文档在哪里?

浏览规则源代码,我注意到他们正在调用Container(:和) ,这是我很少看到的。 事实上,我见过的唯一另一个地方就是制作gem

快速浏览显示Container子类Array ,以及快速跳转到Pry显示Array(:anything) #=> [:anything]

另外快速浏览一下Array的ruby文档并没有对这个问题有所了解。

Array()调用了什么方法,它在哪里记录,如何定义这样的方法,它在ruby中被认为是“坏forms”?

对于你的第一个问题,答案是它创建了一个参数数组。

对于你的第二个,我不知道,但它很简单。

对于你的第三个,这里是:在Ruby中,定义一个与类同名的全局方法只有在用于构造或转换该类型的更基本类型的对象时才被认为是良好的forms。 除非您创建某种低类型,否则不应定义此方法。 你可以为像BigInt128这样的类定义它,但你不应该为ObscureOrSpecializedType678 。 这些方法也有一种设计。

如果传递的数据是返回的类型,则返回它。 如果数据是直接相关的类型,请执行明显的转换( FixnumBigInt128 )。 如果传入的数据可以转换并且有些相关( String to Fixnum )转换它(此转换通常仅用于String )。 如果无法转换数据,则抛出exception。 你永远不应该回归“神奇的价值”。

此方法的另一个用途是为非文字类型创建半文字语法。 最好的例子是Rational()Complex() 。 除了进行转换之外,这些函数还允许您以更自然的方式创建配给和复数( Rational(1, 2)Rational.new(1, 2) )。 如果某个参数列表对于类型的文字表示更简单,则可以定义Classname()方法。

在大多数情况下,这些方法只是核心语言的一部分,除非您创建类似BigInt128FancyStringNaturalNumber的类,否则不应定义这些方法。


据我所知,这些定义是:

  • Array(*args) – 将参数作为数组返回
  • Complex(real, complex) – 使用给定的实际和复杂零件创建复数
  • Float(arg) – 返回arg转换为float(也像字符串一样)
  • Integer(arg) – 与Float()相同,但转换为整数(浮点数被截断)
  • Rational(numerator, denominator=1) – 使用给定的部分创建一个Rational数字
  • String(arg) – 通过调用to_s将参数转换为字符串

此外,某些类将[]定义为类方法,该方法用于从基本数据类型(通常仅初始化,而不是转换)(如Hash[] )进行更复杂的初始化。

我不知道它是不是真的,但是对iurb进行了一些测试,我猜它只是一个帮助函数来创建一个新的数组。

鉴于我有这门课

 class MyClass def initialize(arg) puts "Initialized with #{arg.to_s}" end end 

然后我可以定义一个辅助函数

 def MyClass(arg) MyClass.new(arg) end 

你走了

 irb(main):009:0> MyClass(1) Initialized with 1 => # 

呃,既然你在Pry,为什么不让Pry给你看文件?!?!

 [25] (pry) main: 0> show-doc Array From: object.c in Ruby Core (C Method): Number of lines: 4 Owner: Kernel Visibility: private Signature: Array(arg1) Returns arg as an Array. First tries to call arg.to_ary, then arg.to_a. Array(1..5) #=> [1, 2, 3, 4, 5] [26] (pry) main: 0> show-method Array From: object.c in Ruby Core (C Method): Number of lines: 5 Owner: Kernel Visibility: private static VALUE rb_f_array(VALUE obj, VALUE arg) { return rb_Array(arg); } [27] (pry) main: 0>