🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.ruby
5 messages
5 total messages Started by Jaroslaw Zabiello Wed, 26 Jul 2006 09:47
Zakresy w Pythonie i Ruby
#63
Author: Jaroslaw Zabiello
Date: Wed, 26 Jul 2006 09:47
80 lines
2682 bytes
Na grupie Pythona padło pytanie:

>> Widzial ktos moze implementacje stricte matematycznego przedzialu
>> liczbowego? Uzycie widzialbym jako cos w rodzju:
>> 
>>>>> p1 = przedzial(1,5)
>>>>> 3.14 in p1
>>>>> True
>> 
>>>>> p2 = przedzial(3,7)
>>>>> p1 + p2
>>>>> (1,7)
>>>>> p1*p2
>>>>> (3,5)
>> itd...

Jako ciekawostkę porównałem sobie Pythona z Ruby. Pythonowa implementacja
mogłaby wyglądać:

class Range(object):
    def __init__(self, start, end):
        self.start, self.end = start, end
    def included(self,value):
        return self.start <= value <= self.end
    def __add__(self, obj):
        start, end = self.start, self.end
        if obj.start < self.start: start = obj.start
        if obj.end > self.end: end = obj.end
        return Range(start, end)
    def __mul__(self, obj):
        start, end = self.start, self.end
        if obj.start > self.start: start = obj.start
        if obj.end < self.end: end = obj.end
        return Range(start, end)
    def __str__(self):
        return "(%s,%s)" % (self.start, self.end)

>>>> p1 = Range(1,5)
>>>> p2 = Range(3,7)
>>>> print (p1+p2)
> (1,7)
>>>> print (p1*p2)
> (3,5)
>>>> print p1
>>>> print p1
> (1,5)
>>>> print p2
> (3,7)
>>>> print Range(10,20) * Range(12,30) * Range(15,18)
> (15,18)

Kod Rubiego jest krótszy bo zakresy są już wbudowane w język. Wystarczy
tylko rozszerzyć ją o dodatkowe możliwości:

class Range
  def +(obj)
    b, e = self.begin, self.end
    b = obj.begin if obj.begin < b
    e = obj.end if obj.end > e
    Range.new(b,e)
  end
  def *(obj)
    b, e = self.begin, self.end
    b = obj.begin if obj.begin > b
    e = obj.end if obj.end < e
    Range.new(b,e)
  end
end

p1 = 1..5
p2 = 3..7
p (1..5).include?(3.14) #=> true
p (1..5).include?(13.14) # => false
p p1 + p2 # => 1..7
p p1 * p2 # => 3..5
p p1 * p2 * (4..6) # => 4..5

-- 
Jarosław Zabiełło
http://blog.zabiello.com
Re: Zakresy w Pythonie i Ruby
#64
Author: Jaroslaw Zabiello
Date: Wed, 26 Jul 2006 09:58
16 lines
1109 bytes
Zapomnialem o pythonowym __contains__. Po dodaniu do klasy Range:

    def __contains__(self,value):
        return self.included(value)

mozna wtedy wykonywac

 >>> 3.14 in Range(1,10)
True
>>> 31.14 in Range(1,10)

Nie wiem czy w Ruby mozna przeciazyc slowo "in". Chyba nie. 

-- 
Jarosław Zabiełło
http://blog.zabiello.com
Re: Zakresy w Pythonie i Ruby
#65
Author: Daniel Owsiański
Date: Wed, 26 Jul 2006 11:36
23 lines
1564 bytes
Jaroslaw Zabiello napisał(a):
> Zapomnialem o pythonowym __contains__. Po dodaniu do klasy Range:
> 
>     def __contains__(self,value):
>         return self.included(value)
> 
> mozna wtedy wykonywac
> 
>  >>> 3.14 in Range(1,10)
> True
> 
>>>>31.14 in Range(1,10)
> Nie wiem czy w Ruby mozna przeciazyc slowo "in". Chyba nie. 

czy nie sądzisz, że bardziej czytelna (i przy okazji bardziej zgodna z 
ruby-way) byłaby konstrukcja:

31.15.in? 1..5

czyli dodanie metody 'in?' do Numeric

-- daniel
http://jarmark.org
Re: Zakresy w Pythonie i Ruby
#66
Author: Jaroslaw Zabiello
Date: Wed, 26 Jul 2006 11:47
20 lines
1586 bytes
On Wed, 26 Jul 2006 13:36:41 +0200, Daniel Owsiański wrote:

>> Nie wiem czy w Ruby mozna przeciazyc slowo "in". Chyba nie. 
> 
> czy nie sądzisz, że bardziej czytelna (i przy okazji bardziej zgodna z 
> ruby-way) byłaby konstrukcja:
> 
> 31.15.in? 1..5
> 
> czyli dodanie metody 'in?' do Numeric

Po co to tworzyć, skoro już mamy poprawną filozoficznie konstrukcję
(1..5).include?(31.5) ? Ja proponowałem dodać trochę takiego lukru, bo Ruby
też dodał "for x in y", więc "if x in y" byłoby równie naturalne. Albo,
zgadzając się z Marcinem M., wywaliłbym "in" w ogóle ze składni Rubiego
skoro takie podejście nie jest spójne z filozofią komunikatów.

-- 
Jarosław Zabiełło
http://blog.zabiello.com
Re: Zakresy w Pythonie i Ruby
#67
Author: Daniel Owsiański
Date: Wed, 26 Jul 2006 12:37
26 lines
2239 bytes
Jaroslaw Zabiello napisał(a):
> On Wed, 26 Jul 2006 13:36:41 +0200, Daniel Owsiański wrote:
>>czy nie sądzisz, że bardziej czytelna (i przy okazji bardziej zgodna z 
>>ruby-way) byłaby konstrukcja:
>>
>>31.15.in? 1..5
>>
>>czyli dodanie metody 'in?' do Numeric
> Po co to tworzyć, skoro już mamy poprawną filozoficznie konstrukcję
> (1..5).include?(31.5) ? Ja proponowałem dodać trochę takiego lukru, bo Ruby
> też dodał "for x in y", więc "if x in y" byłoby równie naturalne. Albo,
> zgadzając się z Marcinem M., wywaliłbym "in" w ogóle ze składni Rubiego
> skoro takie podejście nie jest spójne z filozofią komunikatów.

przeciez nic wielkiego do utworzenia to tu nie ma ot pare linijek...
a uzyskany efekt może czasem poprawic czytelnosc kodu (oczywiscie to jak 
zwykle kwestia gustu).

Co do "for x in y" - cos w tym jest, ja również odnosze wrażenie że ta 
konstrukcja została dodana, żeby nie można było powiedzieciec ze Ruby 
nie ma pętli for ;) W każdym razie ja nie przypominam sobie abym 
kiedykolwiek używał tej konstrukcji w Ruby.


-- daniel
http://jarmark.org
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads