关于rails上的ruby:在模块中声明一个类

Declaring a class within a module

测量工作代码(在一个名为Surveyor的模块中,不能少),试图理解它。 我跑过这个包含模块中的类的部分。 这和包含模块一样吗? 如果没有,这样做有什么好处? 谢谢。 (奖励要点:为什么我们将自己附加到课堂上,是不是已经隐含了?)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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(/(<[^>]*>)|
|\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


what is the advantage of doing it this way?

它充当命名空间,因此具有相同名称的类不会发生冲突(因此它与mixin无关)。 这是标准的。

Why are we appending self to class, is that not already implied?

这只是定义类方法的方法之一(另一种是def self.method_name)。


Is this the same as including the module?

不。当你有module Foo; end然后做

1
2
3
class Bar
  include Foo
end

最终得到一个包含模块Foo的所有方法的类Bar。 但是当我们做的时候

1
2
3
4
module Foo
  class Bar
  end
end

我们最终得到一个Foo::Bar类,其中Foo中没有包含Bar中没有的方法

what is the advantage of doing it this way?

如果需要,它允许您组织代码。

Why are we appending self to class, is that not already implied?

不,它还没有"隐含"。 这样做等同于使用self.(如def self.mymethod; end)定义该块中的每个方法。 请参阅Ruby中的类<< self idiom。