Все объекты гарантированно имеют метод .equals()
, поскольку Object содержит метод, .equals()
, который возвращает логическое значение. Задача подкласса переопределять этот метод, если требуется дополнительное определение определения. Без него (т. Е. Используя ==
) только адреса памяти проверяются между двумя объектами для равенства. String переопределяет этот метод .equals()
и вместо использования адреса памяти возвращает сравнение строк на уровне символа для равенства.
Ключевое замечание состоит в том, что строки хранятся в одном пуле, поэтому после создания строки он всегда хранится в программе по тому же адресу. Строки не меняются, они неизменяемы. Вот почему это плохая идея использовать регулярную конкатенацию строк, если у вас есть серьезное количество обработки строк. Вместо этого вы будете использовать предоставленные классы StringBuilder
. Помните, что указатели на эту строку могут измениться, и если вам было интересно увидеть, были ли два указателя одинаковыми ==
, это был бы прекрасный способ. Строки сами не делают.
Проблема здесь, вероятно, заключается в обратном слэше, который имеет значительное значение внутри интерполированных строк Ruby, двойных кавычек, но также и команд оболочки в стиле backtick.
Таким образом, ваша команда интерпретируется как:
move /y c:^Iechprogs^Gzzz.azz c:^Iechprogs^Gutorun.bat
Где ^I
- "\t"
, который является символом табуляции, а ^G
- "\a"
, который является колоколом. характер .
Вместо этого:
`move /y c:\\techprogs\\azzz.azz c:\\techprogs\\autorun.bat`
Теперь помните, что в Ruby есть очень обширная библиотека функций, которую вы можете использовать для непосредственного решения этой проблемы. Не относитесь к нему как к необычному языку сценариев оболочки:
require 'fileutils'
FileUtils.mv('c:\techprogs\azzz.azz', 'c:\techprogs\autorun.bat', force: true)
Здесь я использую одинарные кавычки, чтобы избежать двойной обратной косой черты, а force: true
эквивалентен /y
. При этом используются FileUtils.mv
, часть целого пакета полезных утилит для работы с файлами и каталогами.
В качестве плюса вы также получаете правильные исключения, если что-то идет не так, или код ошибки, если перемещение не удалось.
Добавлено barlop
Подтверждение выше. Двойная обратная косая черта исправляет это, и я вижу, что с помощью команды put `echo copy / yc: \ techprogs ...` что происходит с одиночной обратной косой чертой, я вижу, что t techprogs удалено, так как c:\techprogs
стало c:<ascii-9>echprogs.
И \autorun
стало <ascii-7>utorun
C:\rubytest>cmdoutoutwithoutinitbat.rb | xxd
0000000: 6162 6364 6566 670d 0a63 6f70 7920 2f79 abcdefg..copy /y
0000010: 2063 3a09 6563 6870 726f 6773 0775 746f c:.echprogs.uto
0000020: 7275 6e2e 6261 7420 633a 0965 6368 7072 run.bat c:.echpr
0000030: 6f67 7307 7a7a 7a2e 617a 7a0d 0a61 6263 ogs.zzz.azz..abc
0000040: 6465 6667 0d0a 6d6f 7665 202f 7920 633a defg..move /y c:
0000050: 0965 6368 7072 6f67 7307 7a7a 7a2e 617a .echprogs.zzz.az
0000060: 7a20 633a 0965 6368 7072 6f67 7307 7574 z c:.echprogs.ut
0000070: 6f72 756e 2e62 6174 0d0a orun.bat..
C:\rubytest>