2016-02-19 2 views
0

Array класс можно получить из Module класса:Почему класс `Array` доступен из классов, которые его не расширяют?

module Foo 
    def arr 
    @arr = [] 
    end 

    def add_to_arr(obj) 
    arr.push(obj) 
    end 
end 

но Module не подкласс Array. Приведенное выше определение модуля является законным. Как можно получить методы из класса Array из класса Module, если Module не является подклассом Array?

+0

Вы имеете в виду тот факт, вы можете получить доступ к '[]', или что вы можете назвать 'arr' в своих методах? – berkes

+0

Расширение, включение, добавление, наследование не имеют отношения к делу. Такой вызов всегда возможен, если у вас есть явный приемник с общедоступными методами. – sawa

+1

Это была бы довольно бесполезная система, если бы вы могли только вызвать методы изнутри иерархии. –

ответ

0

[] является объектом Array класса, поэтому он имеет доступ ко всем методам экземпляра класса, такие как Array#push:

[].class # => Array 

[].public_methods 
=> [:fill, :assoc, :rassoc, :uniq, :uniq!, :compact, :compact!, :flatten, :to_h, :flatten!, :shuffle!, :shuffle, :include?, :combination, :repeated_permutation, :permutation, :product, :sample, :repeated_combination, :bsearch_index, :bsearch, :select!, :&, :*, :+, :-, :sort, :count, :find_index, :select, :reject, :collect, :map, :pack, :first, :any?, :reverse_each, :zip, :take, :take_while, :drop, :drop_while, :cycle, :insert, :|, :index, :rindex, :replace, :clear, :<=>, :<<, :==, :[], :[]=, :reverse, :empty?, :eql?, :concat, :reverse!, :inspect, :delete, :length, :size, :each, :slice, :slice!, :to_ary, :to_a, :to_s, :dig, :hash, :at, :fetch, :last, :push, :pop, :shift, :unshift, :frozen?, :each_index, :join, :rotate, :rotate!, :sort!, :collect!, :map!, :sort_by!, :keep_if, :values_at, :delete_at, :delete_if, :reject!, :transpose, :find, :entries, :sort_by, :grep, :grep_v, :detect, :find_all, :flat_map, :collect_concat, :inject, :reduce, :partition, :group_by, :all?, :one?, :none?, :min, :max, :minmax, :min_by, :max_by, :minmax_by, :member?, :each_with_index, :each_entry, :each_slice, :each_cons, :each_with_object, :chunk, :slice_before, :slice_after, :slice_when, :chunk_while, :lazy, :instance_of?, :public_send, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :private_methods, :kind_of?, :instance_variables, :tap, :public_method, :singleton_method, :is_a?, :extend, :define_singleton_method, :method, :to_enum, :enum_for, :===, :=~, :!~, :respond_to?, :freeze, :display, :object_id, :send, :nil?, :class, :singleton_class, :clone, :dup, :itself, :taint, :tainted?, :untaint, :untrust, :trust, :untrusted?, :methods, :protected_methods, :public_methods, :singleton_methods, :!, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__] 
-1

Вы можете создать массивы несколько различных способов в Ruby:

Array.new создает новый объект класса Array.

Array сама по себе вызывает метод Array на объект ядра, который возвращает массив http://ruby-doc.org/core-2.2.0/Kernel.html#method-i-Array

[] это просто синтаксический сахар для буквального строительства объекта Array. https://github.com/ruby/ruby/blob/4df168074c9e80822b4326a4539600ae7dbe0adb/array.c#L5791

И Array и Kernel являются частью основной библиотеки и поэтому доступны для всех объектов.

EDIT на основе @ Штефана коррекции

+1

'[]' is * not * синтаксический сахар для 'Kernel :: Array'. Последняя является функцией преобразования. Попробуйте 'Kernel :: Array (1..5)' vs. '[1..5]' – Stefan

Смежные вопросы