🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.ruby
Article #222

Re: Jak dodać własną metodę typu nazwa! do klasy?

#222
From: Marcin Mielżyński
Date: Sun, 08 Oct 2006 00:04
97 lines
3615 bytes
Rafał Komorowski wrote:
> Bardzo ciekawy artykulik. Dobrze, że coraz więcej jest bardziej 
> zaawansowanych materiałów o Rubym, idziemy do przodu! :-)
> 

najlepszy materiał to http://rhg.rubyforge.org/ - szkoda że tylko część 
jest przetłumaczona na angielski, plus oczywiście źródła.


na szybko zrobiłem rozszerzenie z tą metodą round01 - działa bez problemu:

mutfloat.c:

#include "ruby.h"

static VALUE
round01(num)
     VALUE num;
{
    double val = RFLOAT(num)->value;
    if (val > 0.0) val = floor(val+0.5);
    if (val < 0.0) val = ceil(val-0.5);

    RFLOAT(num)->value = val;

     return num;
}

void Init_Mutfloat(){
     rb_define_method(rb_cFloat, "round01!",  round01, 0);
}

gcc -shared mutfloat.c -lruby -o MutFloat.so

można też wcisnać do numeric.c - będzie wtedy pełen built-in

require 'Mutfloat.so' # to jeśli nie built-in

b = a = 1.3
p a.round01!
p b

i tego właśnie Matz chciał pewnie uniknąć...

Druga sprawa - patrzę na źródła 1.9 - RFloat jeszcze tam jest - ale może 
się zdarzyć że pewnego dnia FLoat stanie się immediate i nie będzie już 
żadnych sztuczek (np: rezerwacja 3 bitu z VALUE). W tej chwili Floaty w 
Rubym są bardzo kosztowne niewiele dając w zamian.



>> ...Najlepiej zrób kompozycje.
> 
> Co masz na myśli? "aggregation" w sensie railsowym?
> 
> A tak ogólnie, w klasach wbudowanych w Rubiego bardzo brakuje mi paru 
> dość oczywistych funkcji, w tym właśnie zaokrąglania floata do zadanego 
> miejsca po przecinku. Szkoda takie podstawowe rzeczy implementować już w 
> interpretowanym kodzie, do tego przecież właśnie dobrze nadaje się 
> kompilowane C.
> Ponadto chciałbym też mieć sprintf, które generuje przecinek jako 
> decimal-point i kropkę jako thousands-separator, ale to już z innej 
> beczki. Z braku lepszego pomysłu mam po prostu:
> 
>  class Fixnum
>    def format00
>      sprintf("%d", self).gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1.")
>    end
>  end
> 
> ale serce mi się kraje, jak widzę wyrażenia regularne zastosowane do tak 
> prymitywnych rzeczy. Może jednak warto nauczyć się robić wstawkę w C do 
> kodu Rubiego? Nie interesowałem się tym na razie, ale widzę, że w 
> "biblii" jest to szeroko opisane.
> 
> 

wszystko jest ;)

puts "%.3f" % 12.5234

z wypełnionymi spacjami: "%10.3f" % 12.5234
i wyrównane do lewej: "%-10.3f" % 12.5234

jest do tego pełna dokumentacja String#sprintf i String#%
albo po prostu:

man sprintf

jest też fajny man online:

http://man.splitbrain.org/sprintf


po co wymyślać koło....

lopex
Technical Details
Message-ID: <eg9f9k$d1j$1@news.onet.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mail
References: <eg90si$dj4$1@news.task.gda.pl> <eg96pc$u4t$1@news.onet.pl> <eg9d1o$q20$1@news.task.gda.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!not-for-mail
From: Marcin Mielżyński <lopx@gazeta.pl>
Newsgroups: pl.comp.lang.ruby
Subject: Re: Jak dodać własną metodę typu
 nazwa! do klasy?
Date: Sun, 08 Oct 2006 02:04:00 +0200
Organization: Onet.pl
Lines: 97
Message-ID: <eg9f9k$d1j$1@news.onet.pl>
References: <eg90si$dj4$1@news.task.gda.pl> <eg96pc$u4t$1@news.onet.pl> <eg9d1o$q20$1@news.task.gda.pl>
NNTP-Posting-Host: chello087207016023.chello.pl
Mime-Version: 1.0
X-Trace: news.onet.pl 1160265846 13363 87.207.16.23 (8 Oct 2006 00:04:06 GMT)
X-Complaints-To: usenet@news.onet.pl
NNTP-Posting-Date: Sun, 8 Oct 2006 00:04:06 +0000 (UTC)
X-Sender: 5Da2qcG7AWj7WISFX859Php/OS6q4VnB
In-Reply-To: <eg9d1o$q20$1@news.task.gda.pl>
User-Agent: Thunderbird 1.5.0.7 (Windows/20060909)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit