Hi,
In message "[ruby-talk:4872] Re: FEATURE REQUEST: Fixnum bitfields"
on 00/09/12, Dave Thomas <Dave / thomases.com> writes:
|> |I just realized that the '[]=' is not implimented for Fixnum and Bignum.
|> |Add that to my feature request. :)
|>
|> I don't think it's possible, since Numbers are immutable.
|> There's no way to change a value in a variable by invoking a method.
|
|Is it a different operation than (say) Fixnum#<< or Fixnum#+ ?
|Wouldn't it just return a new Fixnum?
Fixnum#+ returns new fixnum. But you probably want
foo = 0xff
foo[1,1] = 0
make the value of foo to be 0xfe. To archive this, there are two
options:
(a) change the value of the object referenced from the variable foo,
which is impossible for immutable.
(b) change the value of the variable foo, which is impossible for
current Ruby behavior. Method invocation does not affect the
value of the variable, altough it may change the state of the
object.
Then, possible solutions are:
(1) use mutable object, e.g. BitVector like Andy mentioned in
[ruby-talk:4858].
(2) define String#| etc. to treat string as bitstring. in addition,
String and Integer should be interexchangable.
(3) avoid using []=. define new bit operations to Integer. for
example:
foo = 0xfffffffffffffff
foo = foo.vec(36,4,DATA_SEGMENT)
(4) or other better ideas I can't think of right now.
Personally, I prefer (1).
matz.