Могу ли я создать такой объект в Ruby / Java / C #? - PullRequest
1 голос
/ 09 ноября 2010

Не могли бы вы создать объект из класса с именем Trung.NguyenThe, поскольку NguyenThe не является методом?

Ответы [ 4 ]

3 голосов
/ 09 ноября 2010

В Java C # и Ruby вы не можете создавать переменные с . в имени.

// C# and Java
Object Trung.NguyenThe = "";
# Ruby
Trung.NguyenThe = ""

Это имя переменной недопустимо во всех трех языках.

Если вы хотитечтобы сделать что-то похожее на это, используйте подчеркивание _.

// C# and Java
Object Trung_NguyenThe = "";
# Ruby
Trung_NguyenThe = ""
1 голос
/ 09 ноября 2010

В Ruby нет такого понятия, как имя класса.Классы - это просто объекты, как и любой другой объект, который присваивается переменным, как и любая другая переменная.

Trung.NguyenThe не является допустимым именем переменной, поэтому это невозможно:

class Object
  klass = Class.new do
    def to_s; 'Hello' end
  end
  const_set :'Trung.NguyenThe', klass
  # NameError: wrong constant name Trung.NguyenThe
end

Вы может , конечно, создать объект, который отвечает на сообщение NguyenThe с классом, и назначить этот объект переменной с именем Trung, но это не то, о чем вы спрашиваете:

klass = Class.new do
  def to_s; 'Hello' end
end
(Trung = Object.new).define_singleton_method(:NguyenThe) { klass }

puts Trung.NguyenThe.new
# Hello

В C # и Java точки также недопустимы в именах классов.C # имеет механизм экранирования, который позволяет вам использовать в качестве имен зарезервированные слова, но этот механизм не позволяет использовать недопустимые имена, только зарезервированные.

Существуют предложения по большей символической свободе в именах Java, но до сих пор они еще не реализованы.

1 голос
/ 09 ноября 2010

Прежде всего, объекты не имеют имен. Классы и переменные делают.

Итак, я предполагаю, что вы спрашиваете об именовании классов с точками (на основе вашего последнего комментария) ...

Прямой ответ - «нет», но его можно эмулировать, используя пространства имен / пакеты или внутренние классы.

Пространство имен:

namespace Trung {
    public class NguyenThe {}
}

// Usage:
namespace Whatever {
    public class Client {
        public main() {
            var x = new Trung.NguyenThe();
        }
    }
}

Внутренний класс:

namespace Whatever {
    public class Trung {
        public class NguyenThe {}
    }

    // Usage:
    public class Client {
        public main() {
            var x = new Trung.NguyenThe();
        }
    }
}

(Примечание: это код на C #, но я уверен, что то же самое можно сделать и в Java. Полагаю, что в Ruby есть такие же понятия).

0 голосов
/ 09 ноября 2010

Конечно. Создайте пакет под названием Trung. В этом пакете создайте класс с именем NguyenThe.

Или вы предполагаете, что Trung уже является именем класса?

...