2012-06-15 4 views
8

Код съемки (в модуле под названием Surveyor, не менее), пытаясь понять его. Я просмотрел этот раздел, содержащий класс внутри модуля. Это то же самое, что и включение модуля? Если нет, то в чем преимущество этого? Благодарю. (Бонусные баллы: Почему мы присоединените себя в класс, является то, что уже не подразумевается?)Объявление класса в модуле

module Surveyor 
    class Common 
    RAND_CHARS = [('a'..'z'), ('A'..'Z'), (0..9)].map{|r| r.to_a}.flatten.join 
    OPERATORS = %w(== != < > <= >= =~) 

    class << self 
     def make_tiny_code(len = 10) 
     if RUBY_VERSION < "1.8.7" 
      (1..len).to_a.map{|i| RAND_CHARS[rand(RAND_CHARS.size), 1] }.join 
     else 
      len.times.map{|i| RAND_CHARS[rand(RAND_CHARS.size), 1] }.join 
     end 
     end 

     def to_normalized_string(text) 
     words_to_omit = %w(a be but has have in is it of on or the to when) 
     col_text = text.to_s.gsub(/(<[^>]*>)|\n|\t/su, ' ') # Remove html tags 
     col_text.downcase!       # Remove capitalization 
     col_text.gsub!(/\"|\'/u, '')     # Remove potential problem characters 
     col_text.gsub!(/\(.*?\)/u,'')     # Remove text inside parens 
     col_text.gsub!(/\W/u, ' ')      # Remove all other non-word characters  
     cols = (col_text.split(' ') - words_to_omit) 
     (cols.size > 5 ? cols[-5..-1] : cols).join("_") 
     end 

     def equal_json_excluding_wildcards(a,b) 
     return false if a.nil? or b.nil? 
     a = a.is_a?(String) ? JSON.load(a) : JSON.load(a.to_json) 
     b = b.is_a?(String) ? JSON.load(b) : JSON.load(b.to_json) 
     deep_compare_excluding_wildcards(a,b) 
     end 
     def deep_compare_excluding_wildcards(a,b) 
     return false if a.class != b.class 
     if a.is_a?(Hash) 
      return false if a.size != b.size 
      a.each do |k,v| 
      return false if deep_compare_excluding_wildcards(v,b[k]) == false 
      end 
     elsif a.is_a?(Array) 
      return false if a.size != b.size 
      a.each_with_index{|e,i| return false if deep_compare_excluding_wildcards(e,b[i]) == false } 
     else 
      return (a == "*") || (b == "*") || (a == b) 
     end 
     true 
     end 

     alias :normalize :to_normalized_string 

     def generate_api_id 
     UUIDTools::UUID.random_create.to_s 
     end 
    end 
    end 
end 

ответ

15

что является преимуществом делать это таким образом?

Он служит как namespace, поэтому классы с таким же именем не сталкиваются (так что это не имеет никакого отношения к mixins). Это стандартно.

Почему мы добавляем себя в класс, это уже не подразумевается?

Это только один из способов: defining class-methods (другой - def self.method_name).

+0

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

11

Это то же самое, что и включение модуля?

Нет, когда у вас есть module Foo; end, а затем сделать

class Bar 
    include Foo 
end 

Вы в конечном итоге с классом Bar, который включает в себя все методы модуля Foo. Но когда мы делаем

module Foo 
    class Bar 
    end 
end 

Мы заканчиваем с классом Foo::Bar, который не включает в себя ни один из методов в Foo, которые не являются в Bar

Что такое преимущество делает это таким образом?

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

Почему мы добавляем себя в класс, это уже не подразумевается?

Нет, это еще не «подразумевается». Это эквивалентно определению каждого метода в этом блоке с self., например def self.mymethod; end. См. class << self idiom in Ruby.

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