Направляющие - хеш констант?

Вы можете сделать это, используя операции сдвига влево и вправо. Они преобразуют байты в целые числа, поэтому их необходимо преобразовать обратно в байт.

Ниже приведен основной пример. Я использую индексы, начинающиеся с 0, поэтому для проверки вашего примера вы должны вызвать rangeOf (sourceByteArray, 4, 11) Эта функция только демонстрирует метод; проверка должна быть сделана на диапазонах, и это может быть сделано быстрее.

public byte[] rangeOf(byte[] source, int start, int end){
        int firstSourceByte = start/8;
        int shift = start%8;
        int size = (end - start)/8;
        if ((end - start)%8>0) size++;
        byte[] returnArray = new byte[size];

        for(int i = 0; i < size; i++) {
            returnArray[i] = (byte) (source[firstSourceByte + i] << shift);
            returnArray[i] += (byte) (source[firstSourceByte + i +1] >> (8 - shift));
        }

        return returnArray;
    }
10
задан Rômulo Ceccon 3 May 2009 в 21:53
поделиться

3 ответа

Вы можете кодировать пользовательский метод записи:

STATUS_VALUES = { 1 => 'new', 2 => 'modified', 3 => 'deleted' }

class Foo
  attr_reader :status_id

  def status
    STATUS_VALUES[@status_id]
  end

  def status=(new_value)
    @status_id = STATUS_VALUES.invert[new_value]
    new_value
  end
end

Например, следующая программа:

foo_1 = Foo.new

foo_1.status = 'new'
puts "status: #{foo_1.status}"
puts "status_id: #{foo_1.status_id}"

foo_1.status = 'deleted'
puts "status: #{foo_1.status}"
puts "status_id: #{foo_1.status_id}"

выводит:

status: new
status_id: 1
status: deleted
status_id: 3
14
ответ дан 3 December 2019 в 20:43
поделиться

Одним из способов может быть использование констант

module MyConstants
  New  = 1
  Used = 2
end

. Затем вы можете использовать их примерно так

Foo.status = MyConstants::New

или даже так, если вам небезразлично загрязнение пространства имен

include MyConstants
Foo.status = New

С другой стороны, возможно, вы захотите использовать конечный автомат .

1
ответ дан 3 December 2019 в 20:43
поделиться

I'd just go ahead and use symbols, something like

Foo.status = :new

They're basically immutable strings, meaning that no matter how many times you use the same symbol in your code, it's still one object in memory:

>> :new.object_id
=> 33538
>> :new.object_id
=> 33538
>> "new".object_id
=> 9035250
>> "new".object_id
=> 9029510 # <- Different object_id
3
ответ дан 3 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

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