Article View: pl.comp.lang.ruby
Article #222Re: Jak dodać własną metodę typu nazwa! do klasy?
From: Marcin Mielżyński
Date: Sun, 08 Oct 2006 00:04
Date: Sun, 08 Oct 2006 00:04
97 lines
3615 bytes
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-mailReferences:
<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