Насколько я могу понять, оба \\?\
и \??\
относятся к локальному пространству имен локальных DOS-устройств, но действительны в разных контекстах.
\\?\
имеет смысл только для Win32, а не к ядру, за исключением того, что в некоторых особых случаях (например, при обработке точек соединения) ядро будет переводить пути Win32 обратно в пути ядра по мере необходимости.
\??\
имеет смысл как для ядра, так и для Win32 , однако большинство приложений Win32 (включая cmd.exe) не понимают этого.
В конкретных примерах OP: точки соединения и точки монтирования могут содержать либо пути Win32, либо ядра, но обычно содержат пути ядра и dir
просто представляет исходное содержимое без изменений. Предполагается, что WMIC намеренно преобразует путь ядра в путь Win32 или получает данные от функции API, которая делает это.
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.
Надеюсь, это поможет.
Самый простой ответ: нельзя создать экземпляр собственного класса.
class F
def eigen
class << self
self
end
end
end
F.new.eigen.new #=> TypeError: can't create instance of virtual class
Иегуда Кац неплохо объясняет тонкости в "Метапрограммировании в Рубине: это все о себе"
.