如何在不调用新方法的情况下直接将参数传递给类?

时间:2019-06-05 16:19:31

标签: ruby

在Ruby中,可以通过以下方式创建哈希:

Hash(a: 5, b: 6)

可以这样创建一个数组:

Array(100)

可以使用以下代码创建集:

require 'set'
Set[1,2,3]

那么,如何定义一个无需调用initialize方法即可接受参数的类?

2 个答案:

答案 0 :(得分:4)

  

那么,如何定义一个无需调用initialize方法即可接受参数的类?

不能。在您的示例中,HashArray实际上是方法。

使用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]

回到问题:

  

因此,如何定义一个可以接受参数而无需调用的类   初始化方法?

我认为不可能!