'Object' именованный класс в Ruby - PullRequest
3 голосов
/ 16 мая 2009

Есть ли у него недостатки, если я использую Object в качестве имени для своего класса внутри модуля?

module Some
  class Object; end
end

Ответы [ 3 ]

10 голосов
/ 16 мая 2009

На самом деле, этот код должен работать без проблем, поскольку он находится в модуле и, таким образом, находится в пространстве имен. Для простого теста:

module Some
  class Object
    def foo
      "bar"
    end
  end
end

Some::Object.new.foo # "bar"
Some::Object.new.class # "Some::Object"

# And it doesn't pollute the global namespaced Object class:
Object.new.respond_to?(:foo) # false

Однако это может привести к путанице или неоднозначности, если вы включите Some в другой класс или модуль, внутри которого Object будет ссылаться на Some :: Object. Это все равно не повлияет ни на что вне этого класса или модуля.

3 голосов
/ 17 мая 2009

Есть некоторые подводные камни, но это работает. Если вы сделаете это, вы раскроете класс Object, который уже есть в Ruby.

class Object
  def hello
  end
end

Когда вы создадите пространство имен, вы создадите новый класс в этом пространстве имен.

module Foo
  class Object
    # ...
  end
end

С технической точки зрения, это не проблема.

Недостатком является то, что вы должны использовать ::Object, если хотите сослаться на встроенный класс Object. Но ты не так часто это делаешь, так что это не большая проблема.

Другая проблема заключается в том, что это может сбивать с толку других разработчиков, что следует учитывать. По вашему фрагменту трудно сказать, что делает этот ваш Some::Object класс, но, возможно, Some::Record, Some::Entity имеет больше смысла.

0 голосов
/ 16 мая 2009

Object - это зарезервированное слово в Ruby, поэтому его не следует использовать в качестве имени для вашего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...