为什么人们使用嵌套表示法而不是:: syntax?

时间:2015-03-27 12:01:23

标签: ruby

在我眼里,这个:

class Lifeforms::Animals::Person
  # stuff goes here
end

看起来比这更具可读性:

module Lifeforms
  module Animals
    class Person
      # stuff goes here but it's all indented
    end
  end
end

但似乎我看到的所有代码都使用了后面的方法。这有什么特别的原因吗?一个问题是模块可能没有被定义......但对我来说,即使这比最后一个例子更好:

# Just make sure the modules exist
module Lifeforms
  module Animals
  end
end

class Lifeforms::Animals::Person
  # stuff goes here
  # and it doesn't all have to be deeply indented
end

人们为什么要这样做呢?我是唯一一个认为深度嵌套使代码更难阅读的人吗?

2 个答案:

答案 0 :(得分:3)

如果我们举个例子,并“翻转”它:

module Lifeforms::Animals::Person
  # stuff goes here
  # and it doesn't all have to be deeply indented
end

module Lifeforms
  module Animals
  end
end

失败了

NameError: uninitialized constant Lifeforms

“嵌套”语法定义模块,如果它不存在,但“::”语法依赖于事实,模块存在。

已回答类似问题here

答案 1 :(得分:3)

我同意,有时我会使用:: syntax。但请注意,对于两种语法,恒定分辨率的语义是不同的,因此它们并不完全等效:

module A; module B; module C; end ;end ;end
module A; A_CONST=42; end

module A::B::C; puts A_CONST; end
#^ NameError: uninitialized constant A::B::C::A_CONST

module A
   module B
     module C
       puts A_CONST
     end  
   end  
 end  
#^ prints 42