浏览ruleby源代码时,我注意到他们正在调用Container(:and),这是我很少看到的。事实上,我见过它的另一个地方是fabrication gem
快速查看显示Container subclasses Array,Pry
快速跳转显示Array(:anything) #=> [:anything]
。
另一个对Array的ruby文档的快速浏览并没有对这个问题有所了解。
Array()
调用了什么方法,它在哪里记录,如何定义这样的方法,在ruby中它被认为是“坏形式”?
答案 0 :(得分:2)
我不知道它是不是真的,但我对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
=> #<MyClass:0x4770e10>
答案 1 :(得分:2)
对于你的第一个问题,答案是它创建了一个参数数组。
对于你的第二个,我不知道,但它很简单。
对于你的第三个,这里是:在Ruby中,定义一个与类同名的全局方法只有在用于构造或转换该类型的更基本类型的对象时才被认为是良好的形式。除非您创建某种低类型,否则不应定义此方法。您可以为某些类定义此内容,例如BigInt128
,但您不应该ObscureOrSpecializedType678
。还有这些方法的设计。
如果您传递的数据是返回的类型,请将其返回。如果数据属于直接相关类型,请执行明显的转换(Fixnum
至BigInt128
)。如果传入的数据可以转换并且有些相关(String
到Fixnum
)转换它(此转换通常仅适用于String
)。如果无法转换数据,则抛出异常。您应该从不返回“神奇的价值”。
此方法的另一个用途是为非文字类型创建半文字语法。最好的例子是Rational()
和Complex()
。除了进行转换之外,这些功能还允许您以更自然的方式创建口粮和复杂数字(Rational(1, 2)
与Rational.new(1, 2)
)。如果某个参数列表对于类型的文字表示更简单,则可以定义Classname()
方法。
在大多数情况下,这些方法只是核心语言的一部分,除非您创建类似BigInt128
或FancyString
或NaturalNumber
的类,否则不应定义这些方法
据我所知,其中定义的是:
Array(*args)
- 将参数作为数组返回Complex(real, complex)
- 使用给定的实部和复杂部分创建复数Float(arg)
- 返回arg
转换为浮点数(也会像字符串一样)Integer(arg)
- 与Float()
相同,但转换为整数(浮点数被截断)Rational(numerator, denominator=1)
- 使用给定的部分创建一个Rational数字String(arg)
- 通过调用to_s
此外,某些类将[]
定义为类方法,该方法用于从基本数据类型(通常仅初始化,而非转换)进行更复杂的初始化,例如Hash[]
。
答案 2 :(得分:1)
[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>