Почему собственный класс не эквивалентен self.class, когда он выглядит так похоже?

Насколько я могу понять, оба \\?\ и \??\ относятся к локальному пространству имен локальных DOS-устройств, но действительны в разных контекстах.

\\?\ имеет смысл только для Win32, а не к ядру, за исключением того, что в некоторых особых случаях (например, при обработке точек соединения) ядро ​​будет переводить пути Win32 обратно в пути ядра по мере необходимости.

\??\ имеет смысл как для ядра, так и для Win32 , однако большинство приложений Win32 (включая cmd.exe) не понимают этого.

В конкретных примерах OP: точки соединения и точки монтирования могут содержать либо пути Win32, либо ядра, но обычно содержат пути ядра и dir просто представляет исходное содержимое без изменений. Предполагается, что WMIC намеренно преобразует путь ядра в путь Win32 или получает данные от функции API, которая делает это.

79
задан the Tin Man 7 August 2015 в 22:05
поделиться

3 ответа

class << self - это больше, чем просто способ объявления методов класса (хотя его можно использовать таким образом). Вероятно, вы видели такое использование, как:

class Foo
  class << self
    def a
      print "I could also have been defined as def Foo.a."
    end
  end
end

Это работает и эквивалентно def Foo.a , но способ его работы немного тонок. Секрет в том, что self в этом контексте относится к объекту Foo , класс которого является уникальным анонимным подклассом Class . Этот подкласс называется Foo собственным классом . Итак, def a создает новый метод с именем a в собственном классе Foo , доступный с помощью обычного синтаксиса вызова метода: Foo.a .

Теперь давайте посмотрим на другой пример:

str = "abc"
other_str = "def"

class << str
  def frob
    return self + "d"
  end
end

print str.frob # => "abcd"
print other_str.frob # => raises an exception, 'frob' is not defined on other_str

Этот пример такой же, как и предыдущий, хотя сначала может быть трудно сказать. frob определен не в классе String , а в собственном классе str , уникального анонимного подкласса String . Итак, str имеет метод frob , но экземпляры String в целом его не используют. Мы также могли бы иметь переопределенные методы String (очень полезные в некоторых сложных сценариях тестирования).

Теперь мы готовы разобраться в вашем исходном примере. Внутри метода инициализации Foo self относится не к классу Foo , а к некоторому конкретному экземпляру Foo . Его собственный класс является подклассом Foo , но не Foo ; этого не могло быть, иначе трюк, который мы видели во втором примере, не сработал. Итак, чтобы продолжить ваш пример:

f1 = Foo.new(:weasels)
f2 = Foo.new(:monkeys)

f1.weasels = 4 # Fine
f2.monkeys = 5 # Also ok
print(f1.monkeys) # Doesn't work, f1 doesn't have a 'monkeys' method.

Надеюсь, это поможет.

121
ответ дан 24 November 2019 в 09:52
поделиться

Самый простой ответ: нельзя создать экземпляр собственного класса.

class F
 def eigen
  class << self 
   self
  end
 end
end
F.new.eigen.new #=> TypeError: can't create instance of virtual class
46
ответ дан 24 November 2019 в 09:52
поделиться

Иегуда Кац неплохо объясняет тонкости в "Метапрограммировании в Рубине: это все о себе"

.
11
ответ дан 24 November 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: