I found it a lot of fun... trying to understand the code and see how it works. Thank you for this ingenious way to solve the problem.
I have learned that there are some special method names, +@, -@, etc. which are invoked by writing them before the object...mmmm interesting.
But seems it only works with +@ and -@... where could I find more information about it? Can I create other XXX@ methods?
PS: When you create the object IinitContainer(@value, self) (lines 12 and 22).... the value of @value could be anything. It doesn't matter if you put +@value or -@value or nil or whatever because it won't be used.
Thank you very much!
···
--------------------------------------
1 #!/usr/bin/env ruby
2
3 class IntContainer
4 def initialize(value, origref=nil)
5 @value = value
6 @origref = origref
7 end
8
9 def +@
10 case @origref
11 when nil
12 IntContainer.new(@value, self)
13 else
14 @origref.value += 1
15 @origref
16 end
17 end
18
19 def -@
20 case @origref
21 when nil
22 IntContainer.new(@value, self)
23 else
24 @origref.value -= 1
25 @origref
26 end
27 end
28
29 attr_accessor :value
30
31 def method_missing(meth, ...)
32 IntContainer.new(@value.send(meth, ...))
33 end
34
35 def inspect(...) = @value.inspect(...)
36 def to_s(...) = @value.to_s(...)
37 end
38
39 int = IntContainer.new(5)
40
41 puts int + 10
42 puts (++int)
43 puts (--int)
--------------------------------------
Enviado con Proton Mail correo electrónico seguro.
------- Original Message -------
El martes, 29 de noviembre de 2022 a las 20:10, hmdne <hmdne@airmail.cc> escribió:
It isn't possible to implement i++, but it is... kinda... possible to
implement ++i. Take a look at the following code. Just please don't use
it in productionclass IntContainer
def initialize(value, origref=nil)
@value = value
@origref = origref
enddef +@
case @origref
when nil
IntContainer.new(+@value, self)
else
@origref.value += 1
@origref
end
enddef -@
case @origref
when nil
IntContainer.new(-@value, self)
else
@origref.value -= 1
@origref
end
endattr_accessor :value
def method_missing(meth, ...)
IntContainer.new(@value.send(meth, ...))
enddef inspect(...) = @value.inspect(...)
def to_s(...) = @value.to_s(...)
endint = IntContainer.new(5)
p int + 10
++int
p int
--int
p intOn 10/14/22 19:01, iloveruby wrote:
> Is it posible define new method :++ to Integer class?
>
> Thanks!
>
> Enviado desde Proton Mail móvil
>
> -------- Mensaje original --------
> El 14 oct 2022 4:53, Martin DeMello < martindemello@gmail.com> escribió:
>
> i++ works in C and similar languages because a variable is a
> concrete object, representing a specific chunk of memory. i++
> increments the contents of that chunk of memory.
>
> in ruby, a variable is a transparent reference to an object, so
> any operation on a variable is actually an operation on the object
> it points to. i++ would mean "mutate the object i points to by
> incrementing it by 1", and since numbers are immutable you cannot
> do that. on the other hand, "i += 1" is just shorthand for "i =
> i + 1", which means "point the variable i to a new object that is
> 1 more than the object it currently points to", which works fine
> with ruby's semantics.
>
> here's an illustration by contrast with strings, which do have
> mutating methods:
>
> irb(main):001:0> a = "hello"
> => "hello"
> irb(main):002:0> b = a
> => "hello"
> irb(main):003:0> a.upcase!
> => "HELLO"
> irb(main):004:0> b
> => "HELLO"
> irb(main):005:0> i = 1
> => 1
> irb(main):006:0> j = i
> => 1
> irb(main):007:0* i++ # <- what would you expect j to be after this?
>
> martin
>
> On Thu, Oct 13, 2022 at 7:40 PM Henrik P henrik@simplemail.co.in > > wrote:
>
> I found for a int the "++" operator doesn't work in ruby.
> such as,
>
> i=0
> i++
>
> not working. but instead it would write as:
>
> i=0
> i += 1
>
> so "++" is not supported in ruby really? thanks
>
> $ ruby -v
> ruby 2.6.3p62 (2019-04-16 revision 67580)
> [universal.x86_64-darwin20]
>
> --
> Simple Mail
> https://simplemail.co.in/
>
> Unsubscribe:
> mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe
> http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk
>
> Unsubscribe: mailto:ruby-talk-request@ruby-lang.org?subject=unsubscribe
> http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-talk______________________________________________
ruby-talk mailing list -- ruby-talk@ml.ruby-lang.org
To unsubscribe send an email to ruby-talk-leave@ml.ruby-lang.org
ruby-talk info -- Info | ruby-talk@ml.ruby-lang.org - ml.ruby-lang.org
______________________________________________
ruby-talk mailing list -- ruby-talk@ml.ruby-lang.org
To unsubscribe send an email to ruby-talk-leave@ml.ruby-lang.org
ruby-talk info -- Info | ruby-talk@ml.ruby-lang.org - ml.ruby-lang.org