在Ruby中,可以通过以下方式创建哈希:
Hash(a: 5, b: 6)
可以这样创建一个数组:
Array(100)
可以使用以下代码创建集:
require 'set'
Set[1,2,3]
那么,如何定义一个无需调用initialize方法即可接受参数的类?
答案 0 :(得分:4)
那么,如何定义一个无需调用initialize方法即可接受参数的类?
使用Set
的示例自然使用Set::[]。因此,它与返回该类实例的任何其他类方法没有什么不同。例如,User::create
(或您拥有什么)。
答案 1 :(得分:0)
在Ruby中,可以通过以下方式创建哈希:
哈希(a:5,b:6)
Hash()实际上是内核模块的一种方法:
p defined?(Hash()) # => "method"
p defined?(Kernel.Hash()) # => "method"
但是没有括号,哈希,数组,字符串等都只是类:
defined?(Hash) # => "constant"
defined?(Array) # => "constant"
在Ruby 2.6.3中,Arrays(),Complex(),Float(),Hash(),Integer(),Rational(),String()和URI()都是相同的-它们都是方法
但是Set
是一个类:
require 'set'
p defined?(Set) # => "constant"
p set = Set[1,2,3] # => #<Set: {1, 2, 3}>
p set.to_a # => [1, 2, 3]
因此,Set [1,2,3]实际上是在调用Set的[]方法。看起来像这样:
class Something
def initialize(*a)
@hash = {}
a.each { |v| @hash.store(v, nil) }
end
def self.[](*a) new(*a) end
define_method(:to_a) { @hash.keys }
define_method(:inspect) { "#<#{self.class}: {#{@hash.keys.to_s[1..-2]}}>" }
alias :to_s :inspect
end
p defined?(Something) # => "constant"
p set = Something[1,2,3] # => #<Something: {1, 2, 3}>
p set1 = Something[[1, 2, 3], 2, 2, 3, 4, {4 => :a}, 5] # => #<Something: {[1, 2, 3], 2, 3, 4, {4=>:a}, 5}>
p set.to_a # => [1, 2, 3]
p set1.to_a # => [[1, 2, 3], 2, 3, 4, [4, 4], 5]
回到问题:
因此,如何定义一个可以接受参数而无需调用的类 初始化方法?
我认为不可能!