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.