Как протестировать, неизменен ли объект Ruby?

У тебя не должно быть проблем. Просто убедитесь, что версия python такая же, так как я считаю, что по умолчанию на Mac используется 2.7.

Кроме того, сценарии Python не компилируются, а скорее интерпретируются, поэтому создание исполняемого файла на самом деле не означает, что в данном случае это двоичный файл. Я не уверен, какой метод вы использовали для запуска python на компьютере, на котором нет python, как есть несколько, но если вам удастся сделать это на Windows, он должен работать на Mac.

5
задан Justin Love 18 January 2009 в 19:50
поделиться

4 ответа

В Ruby нет никаких элементарных объектов. Это не может поэтому быть обнаружено простым способом.

Вы не можете просто использовать Маршала или YAML для Вашего имеющего версию хранилища? Затем Вы получите загрузку и сохранение всех типов объектов бесплатно. Почему изобретают велосипед?

Я не знаю то, чего Вы хотите достигнуть точно, но рассмотрение источника YAML может быть интересно видеть, как они решают эту проблему. YAML Ruby кодирование реализации просто реализует to_yaml метод для всех соответствующих классов. См. yaml/rubytypes.rb.

4
ответ дан 18 December 2019 в 14:52
поделиться

Идея переменчивости действительно не применяет в Ruby тот же путь как на других языках. Единственный неизменный объект является замороженным. Можно даже добавить методы и переменные экземпляра к Fixnums. Например:

class Fixnum
  attr_accessor :name
end
1.name = "one"
2.name = "two"

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

Если можно придумать канонический список классов, которые Вы хотите принять, неизменны, Вы могли просто пройти и дать им всем immutable?() метод, который возвращает true (и Объект версия, которая возвращает false). Но как сказанный wvanbergen, лучший способ удостовериться, который не изменяет Ваша копия объекта, является к глубокой копии ею с Маршалом.

2
ответ дан 18 December 2019 в 14:52
поделиться

Я нашел неэффективный путь:

class Object
  def primitive?
    begin
      self.dup
      false
    rescue TypeError
      true
    end
  end
end
6
ответ дан 18 December 2019 в 14:52
поделиться

Другое различие: исходно неизменные объекты не могут быть заморожены, но они все еще возвращают false от замороженного?

5.freeze.frozen? == false

Замораживание не повышает исключение (в отличие от дубликата) Однако, это делает (постоянно!) изменяют изменяемые объекты.

Я нашел, что могу (по крайней мере, в, он - текущее состояние), располагают мое приложение для работы с замороженными объектами, и рубин даст мне исключение, если я попытаюсь изменить их непосредственно. Однако заморозьтесь, только влияет на первый уровень объекта, и массивы, и т.д. сохраненные в нем, могут все еще быть изменены.

Это только относится 1.8 - 5.frozen? возвращает true в ruby1.9 (но не в irb1.9)

1
ответ дан 18 December 2019 в 14:52
поделиться
Другие вопросы по тегам:

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