[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: new to this language

Ghelani, Vidhi

2/11/2005 5:43:00 PM


Hi,
I did not quite understand this :

In any file so the code in the if-block will be executed only if the
file is being run directly by the interpreter (e.g.: ruby
hello_world.rb)

So if I had a file hello_world.ruby and if I have the if block in it.
When I give the command ruby hello_world.ruby wont the entire file be
run? SO how does the if block help?

Sorry, but I think I am understanding it wrong.

Thanks,
Vidhi







-----Original Message-----
From: Joao Pedrosa [mailto:joaopedrosa@gmail.com]
Sent: Friday, February 11, 2005 9:36 AM
To: ruby-talk ML
Subject: Re: new to this language

Hi,

> > 3) Do you need a main and a makefile ? I am sure you would need a
main
> > to test it . If yes how do you save the main? In what format?
>
> You don't need a main method. All Ruby code is executed as it is seen
by the
> interpreter. Some of the code above (superclass.rb and myclass.rb)
define
> classes and some of the code (another.rb) creates an instance of a
class and
> prints some output.

Else, you can use

if __FILE__ == $0
p 'Hello World!'
end

In any file so the code in the if-block will be executed only if the
file is being run directly by the interpreter (e.g.: ruby
hello_world.rb). It's useful so you can have a file that behaves like
a library and a program, depending on how it's loaded. You load a
library with the require (or load) command (e.g.: require 'open-uri').

I like to use such capability to test one or another thing in a file
while I'm working on it.

Welcome to Ruby.

Cheers,
Joao






9 Answers

kenobi

4/10/2013 9:44:00 AM

0

W dniu sroda, 10 kwietnia 2013 01:18:10 UTC+2 uzytkownik Ireneusz Szpilewski napisal:
> On Sun, 07 Apr 2013 21:17:35 +0200, identyfikator: 20040501
>
> <NOSPAMtestowanije@go2.pl> wrote:
>
>
>
> > jest taka sprawa, jest sobie liczba dword (32 bity),
>
> > trzeba ja zamienic na skrócona wielkosc pliku, np. 100kB, 1Mb, 10Mb,
>
> > 512kB itp...
>
> >
>
> > jak to szybko i skutecznie zrobic?
>
> >
>
> > tricki z dzieleniem przez 10 lub sumowaniem w BCD raczej odpadaja, mam
>
> > malo pamieci i do tego rejestry 8 bitowe...
>
> >
>
> > tak w ramach rozrywki umyslowej...
>
> >
>
> > tylko BARDZO UPRZEJMIE PROSZE nie flejmowac...
>
> >
>
>
>
> Takie cos ponizej wysmazylem w ramach rozrywki :-), niestety uzylem
>
> recznego mnozenia 4 znakowej liczby dziesietnej (cos na ksztalt BCD), ale
>
> za to bez dzielenia, no i na samych rejestrach 8 bit powinno zadzialac:
>
>
>
> #include <stdio.h>
>
>
>
> /* zeruj wynik */
>
> void dec_zero(unsigned char dec[4])
>
> {
>
> int i;
>
>
>
> for(i = 0; i < 4; i++)
>
> dec[i] = 0;
>
> }
>
>
>
> /* pomnoz wynik razy 2 i dodaj carry (0 lub 1) */
>
> void dec_double(unsigned char dec[4], int carry)
>
> {
>
> int i;
>
> int digit;
>
>
>
> for(i = 0; i < 4; i++)
>
> {
>
> digit = dec[i] * 2 + carry;
>
>
>
> if(digit > 9)
>
> {
>
> digit -= 10;
>
> carry = 1;
>
> }
>
> else
>
> {
>
> carry = 0;
>
> }
>
>
>
> dec[i] = digit;
>
> }
>
> }
>
>
>
> /* wylicz wynik result[4] dla podanej liczby number[4] */
>
> /* i zwroc indeks potegi 1024 (0 = B, 1 = KB, 2 = MB, 3 = GB) */
>
> int convert(const unsigned char number[4], unsigned char result[4])
>
> {
>
> int byte = 3;
>
> int bit = 31;
>
> int bit10 = 1;
>
> int power1024 = 3;
>
> unsigned char mask = 0x80;
>
> int hit = 0;
>
> int bit_is_set;
>
>
>
> dec_zero(result);
>
>
>
> while(bit >= 0)
>
> {
>
> bit_is_set = (number[byte] & mask) != 0;
>
>
>
> dec_double(result, bit_is_set);
>
>
>
> if(bit_is_set)
>
> {
>
> hit = 1;
>
> }
>
>
>
> if(bit10 == 0)
>
> {
>
> if(hit)
>
> return power1024;
>
>
>
> bit10 = 9;
>
> power1024--;
>
> }
>
> else
>
> {
>
> bit10--;
>
> }
>
>
>
> bit--;
>
> mask >>= 1;
>
>
>
> if(mask == 0)
>
> {
>
> mask = 0x80;
>
> byte--;
>
> }
>
> }
>
>
>
> return 0;
>
> }
>
>
>
> /* drukuj liczbe */
>
> void dec_print(unsigned char dec[])
>
> {
>
> int i;
>
> int print = 0;
>
>
>
> for(i = 3; i >= 0; i--)
>
> {
>
> if(print == 0)
>
> print = (dec[i] != 0 || i == 0);
>
>
>
> if(print)
>
> printf("%d", (int) dec[i]);
>
> }
>
> }
>
>
>
> /* programik testujacy do zabawy*/
>
> int main()
>
> {
>
> unsigned char number[4] = {0, 0, 0, 0};
>
> unsigned char result[4] = {0, 0, 0, 0};
>
> const char* power1024_names[4] = {"B", "KB", "MB", "GB"};
>
>
>
> while(1)
>
> {
>
> unsigned try_it;
>
> int power1024;
>
>
>
> printf("liczba hex: ");
>
>
>
> scanf("%x", &try_it);
>
> printf("liczba dec = %u\n", try_it);
>
>
>
> /* katastrofa, jesli unsigned wiekszy niz 4 bajty: */
>
> *(unsigned*)number = try_it;
>
>
>
> power1024 = convert(number, result);
>
> printf("wynik = ");
>
> dec_print(result);
>
> printf("%s\n\n", power1024_names[power1024]);
>
> }
>
>
>
> return 0;
>
> }
>
>
>
> Trzeba by to jeszcze ulepszyc, aby dzialalo sensowniejsze zaokraglanie,
>
> bo teraz zaokragla brutalnie w dol i np. rozmiar 2047 B pokazuje jako 1KB.
>
>
co do zaokraglanie w dól to mz chyba ujdzie

co do kodu to nie rozumiem tego kodu, jak to
dziala? - jedzie jakos po 32 bitach i co
jakis czas mnozy przez dwa i costam porownuje?

(kod raczej nie jest idealny ale jak dziala
to spox,

duzy plus za odpowiedz na temat, bardziej
tak wlasnie widze grupe jako miejsce gdzie
odowiada sie na pytania a nie ... (wiadomo
co )







Ministerstwo Propagandy

4/10/2013 5:25:00 PM

0

dobrze powiedziane, niestety oni dostaj? granty za "wiadomo co"...


Ireneusz Szpilewski

4/10/2013 7:24:00 PM

0

On Wed, 10 Apr 2013 02:19:10 +0200, Borneq <borneq@antyspam.hidden.pl> =

wrote:

> U=C5=BCytkownik "Ireneusz Szpilewski" <irek@szpilewski.opole.pl> napis=
a=C5=82 w =

> wiadomo=C5=9Bci news:op.wvaq0ku4wyk85p@localhost...
>> Trzeba by to jeszcze ulepszyc, aby dzialalo sensowniejsze zaokraglani=
e,
>> bo teraz zaokragla brutalnie w dol i np. rozmiar 2047 B pokazuje jako=
=

>> 1KB.
>
> Wystarczy doda=C4=87 najpierw 512.

Nie bardzo jednak wiem, w ktorym miejscu chcialbys dodac te 512.
Zrobilem za to druga wersje, ktora z kolei zaokragla w gore, czyli np. =

1025 pokazuje jako 2KB. To moze byc lepsze w tych przypadkach, gdy chcem=
y =

miec pewnosc, ze plik napewno nie bedzie wiekszy niz ten rozmiar, ktory =
=

podajemy. Ten drugi algorytm latwo przerobic, aby miec to, o co Ci chodz=
i =

z dodawaniem 512 - zaokraglanie do najblizszej liczby, w gore lub w dol.=
=

Tu jest ta nowa wersja;

#include <stdio.h>

/* zeruj wynik */
void dec_zero(unsigned char dec[4])
{
int i;

for(i =3D 0; i < 4; i++)
dec[i] =3D 0;
}

/* pomnoz wynik razy factor(1 lub 2) i dodaj carry (0 lub 1) */
void dec_double(unsigned char dec[4], int factor, int carry)
{
int i;
int digit;

for(i =3D 0; i < 4; i++)
{
digit =3D factor * dec[i] + carry;

if(digit > 9)
{
digit -=3D 10;
carry =3D 1;
}
else
{
carry =3D 0;
}

dec[i] =3D digit;
}
}

/* wylicz wynik result[4] dla podanej liczby number[4] */
/* i zwroc indeks potegi 1024 (0 =3D B, 1 =3D KB, 2 =3D MB, 3 =3D GB) =
*/
int convert(const unsigned char number[4], unsigned char result[4])
{
int byte =3D 3;
int bit10 =3D 1;
int power1024 =3D 3;
unsigned char mask =3D 0x80;
int hit =3D 0;
int bit_is_set;
int factor =3D 2;

dec_zero(result);

while(1)
{
bit_is_set =3D (number[byte] & mask) !=3D 0;

dec_double(result, factor, bit_is_set);

mask >>=3D 1;

if(mask =3D=3D 0)
{
if(byte =3D=3D 0)
break;

mask =3D 0x80;
byte--;
}
=

if(bit_is_set)
{
if(factor =3D=3D 1)
break;

hit =3D 1;
}

if(bit10 =3D=3D 0)
{
if(hit)
{
factor =3D 1;
bit10--;
}
else
{
bit10 =3D 9;
power1024--; =

}
}
else
{
bit10--;
} =

}

if(result[3] =3D=3D 1 && result[2] =3D=3D 0 && result[1] =3D=3D 2 && re=
sult[0] =3D=3D 4)
{
dec_zero(result);
result[0] =3D 1;
power1024++;
} =

return power1024;
}

/* drukuj liczbe */
void dec_print(unsigned char dec[])
{
int i;
int print =3D 0;

for(i =3D 3; i >=3D 0; i--)
{ =

if(print =3D=3D 0)
print =3D (dec[i] !=3D 0 || i =3D=3D 0);

if(print)
printf("%d", (int) dec[i]);
}
}

/* programik testujacy */
int main()
{
unsigned char number[4] =3D {0, 0, 0, 0};
unsigned char result[4] =3D {0, 0, 0, 0};
const char* power1024_names[4] =3D {"B", "KB", "MB", "GB"};

while(1)
{
unsigned try_it;
int power1024;

printf("liczba hex: ");

scanf("%x", &try_it); =

printf("liczba dec =3D %u\n", try_it);

/* katastrofa, jesli unsigned wiekszy niz 4 bajty: */
*(unsigned*)number =3D try_it;

power1024 =3D convert(number, result);
printf("wynik =3D ");
dec_print(result);
printf("%s\n\n", power1024_names[power1024]);
}

return 0;
} =


> Ale czy na pewno dzieli=C4=87 przez 1024 ?, dla mnie znacznie wygodnie=
jsze =

> by=C5=82oby 1000

No to zalezy, co chcemy osiagnac, czy wynik np. 123 KB ma oznaczac 123 *=
=

1024 bajty po informatycznemu, czy 123 * 1000 bajtow po normalnemu, =

(chociaz wtedy raczej pisze sie kB). Jesli to drugie, to algorytm trzeba=
=

by znacznie zmienic.

Irek

-- =

Using Opera's mail client: http://www.opera...

Ireneusz Szpilewski

4/10/2013 9:23:00 PM

0

On Wed, 10 Apr 2013 02:19:10 +0200, Borneq <borneq@antyspam.hidden.pl> =

wrote:

> U=C5=BCytkownik "Ireneusz Szpilewski" <irek@szpilewski.opole.pl> napis=
a=C5=82 w =

> wiadomo=C5=9Bci news:op.wvaq0ku4wyk85p@localhost...
>> Trzeba by to jeszcze ulepszyc, aby dzialalo sensowniejsze zaokraglani=
e,
>> bo teraz zaokragla brutalnie w dol i np. rozmiar 2047 B pokazuje jako=
=

>> 1KB.
>
> Wystarczy doda=C4=87 najpierw 512. Ale czy na pewno dzieli=C4=87 przez=
1024 ?, dla =

> mnie znacznie wygodniejsze by=C5=82oby 1000

Tu jest wersja z kB =3D 1000B zamiast KB =3D 1024B, dla prostoty tez zao=
kragla =

w dol:

#include <stdio.h>

/* zeruj wynik */
void dec_zero(unsigned char dec[10])
{
int i;

for(i =3D 0; i < 10; i++)
dec[i] =3D 0;
}

/* pomnoz wynik razy 2 i dodaj carry (0 lub 1), *leftmost =3D najstarsza=
=

cyfra wyniku */
void dec_double(unsigned char dec[10], int carry, int* leftmost)
{
int i;
int digit;

for(i =3D 0; i < *leftmost; i++)
{
digit =3D 2 * dec[i] + carry;

if(digit > 9)
{
digit -=3D 10;
carry =3D 1;
}
else
{
carry =3D 0;
}

dec[i] =3D digit;
}

if(carry)
{
dec[i] =3D 1;
(*leftmost)++;
}
}

/* wylicz wynik result[10] dla podanej liczby number[4] */
/* i zwroc najstarsza cyfre wyniku (liczona od 1)) */
int convert(const unsigned char number[4], unsigned char result[10])
{
int byte =3D 3;
unsigned char mask =3D 0x80;
int bit_is_set;
int leftmost =3D 1;

dec_zero(result);

while(1)
{
bit_is_set =3D (number[byte] & mask) !=3D 0;

dec_double(result, bit_is_set, &leftmost);

mask >>=3D 1;

if(mask =3D=3D 0)
{
if(byte =3D=3D 0)
break;

mask =3D 0x80;
byte--;
}
}

return leftmost;
}

/* drukuj wynik */
void dec_print(unsigned char dec[10], int leftmost, const char* =

power1000_names[4])
{
int power =3D (leftmost - 1) / 3;
int count =3D leftmost - power * 3;
int i;

for(i =3D 1; i <=3D count; i++)
{ =

printf("%d", (int) dec[leftmost - i]);
}

printf(power1000_names[power]);
}

/* programik testujacy */
int main()
{
unsigned char number[4] =3D {0, 0, 0, 0};
unsigned char result[10];
const char* power1000_names[4] =3D {"B", "kB", "MB", "GB"};

while(1)
{
unsigned try_it;
int leftmost;

printf("liczba: ");
scanf("%u", &try_it); =


/* katastrofa, jesli unsigned wiekszy niz 4 bajty: */
*(unsigned*)number =3D try_it;

leftmost =3D convert(number, result);
printf("wynik =3D ");
dec_print(result, leftmost, power1000_names);
printf("\n\n");
}

return 0;
} =


Irek
-- =

Using Opera's mail client: http://www.opera...

kenobi

4/10/2013 9:53:00 PM

0

W dniu sroda, 10 kwietnia 2013 19:24:51 UTC+2 uzytkownik Ministerstwo Propagandy napisal:
> dobrze powiedziane, niestety oni dostaja granty za "wiadomo co"...

haha :-) !

RemeK

4/11/2013 9:26:00 AM

0

Dnia Wed, 10 Apr 2013 21:24:00 +0200, Ireneusz Szpilewski napisa??(a):

>>> Trzeba by to jeszcze ulepszyc, aby dzialalo sensowniejsze zaokraglanie,
>>> bo teraz zaokragla brutalnie w dol i np. rozmiar 2047 B pokazuje jako
>>> 1KB.
>>
>> Wystarczy doda?? najpierw 512.
>
> Nie bardzo jednak wiem, w ktorym miejscu chcialbys dodac te 512.

Chyba mial na mysli, ze do wartosci poczatkowej. Jesli masz 2047 i pokazuje
1KB to po dodaniu 512 bedzie 2559 i pokaze juz 2KB. Czyli te 512
"wysrodkuje" zakres w polowie 1025 i ponizej bedzie rownac w dol a powyzej w
gore. Tak czy nie? :-)

--
pozdro
R.e.m.e.K

Ireneusz Szpilewski

4/12/2013 3:45:00 PM

0

W dniu 11.04.2013 o 11:25 R.e.m.e.K <go@dev.null> pisze:

> Dnia Wed, 10 Apr 2013 21:24:00 +0200, Ireneusz Szpilewski napisa=C5=82=
(a):
>
>>>> Trzeba by to jeszcze ulepszyc, aby dzialalo sensowniejsze =

>>>> zaokraglanie,
>>>> bo teraz zaokragla brutalnie w dol i np. rozmiar 2047 B pokazuje ja=
ko
>>>> 1KB.
>>>
>>> Wystarczy doda=C4=87 najpierw 512.
>>
>> Nie bardzo jednak wiem, w ktorym miejscu chcialbys dodac te 512.
>
> Chyba mial na mysli, ze do wartosci poczatkowej. Jesli masz 2047 i =

> pokazuje
> 1KB to po dodaniu 512 bedzie 2559 i pokaze juz 2KB. Czyli te 512
> "wysrodkuje" zakres w polowie 1025 i ponizej bedzie rownac w dol a =

> powyzej w
> gore. Tak czy nie? :-)

No w=C5=82a=C5=9Bnie nie bardzo, bo to jest lekarstwo na zaokr=C4=85glan=
ie w ramach KB, a =

co dla MB i GB?
Np. dla liczby 2096639, kt=C3=B3ra powinna by=C4=87 zaokr=C4=85glona do =
2 MB?

Irek


-- =

U=C5=BCywam klienta poczty Opera Mail: http://www.opera...

Ireneusz Szpilewski

4/15/2013 9:24:00 PM

0

W dniu 10.04.2013 o 11:43 firr kenobi <profesor.fir@gmail.com> pisze:

> co do kodu to nie rozumiem tego kodu, jak to
> dzia=C5=82a? - jedzie jakos po 32 bitach i co
> jakis czas mnozy przez dwa i costam porownuje?

Mniej wiecej wlasnie tak :-). Jak chcesz zamienic liczbe dwojkowa na =

dziesietna to mozna wlasnie tak dzialac: zerujesz wynik, a potem =

analizujesz bity liczby dwojkowej od najstarszego do najmlodszego i jesl=
i =

bit jest rowny 0, to mnozysz wynik razy 2, a jesli bit jest rowny 1, to =
=

mnozysz wynik razy 2 i dodajesz 1. Np. dla liczby dwojkowej 1011 mamy:

wynik =3D 0
lewy bit =3D=3D 1, wi=C4=99c wynik =3D 2 * wynik + 1 =3D=3D 1
nastepny bit =3D=3D 0, wiec wynik =3D 2 * wynik =3D=3D 2
nastepny bit =3D=3D 1, wiec wynik =3D 2 * wynik + 1 =3D=3D 5
ostatni bit =3D=3D 1, wiec wynik =3D 2 * wynik + 1 =3D=3D 11

czyli dwojkowe 1011 =3D=3D 11 dziesietnie

W tym moim algorytmie jeszcze chodzi o wyluskane odpowieniej grupy bitow=
z =

zadanej liczby 32 bitowej, odpowiedzialnych za bajty, kilobajty, megabaj=
ty =

lub gigabajty.
Liczba 32 bitowa, b=C4=99d=C4=85ca rozmiarem pliku, ma ponizsza struktur=
e bit=C3=B3w:

ggmmmmmmmmmmkkkkkkkkkkbbbbbbbbbb

gdzie b: grupa 10 bitow odpowiedzialnych za rozmiar w bajtach
k: grupa 10 bitow odpowiedzialnych za rozmiar w KB
m: grupa 10 bitow odpowiedzialnych za rozmiar w MB
g: grupa 2 bitow odpowiedzialnych za rozmiar w GB

Chodzi o zamiane na liczbe dziesietna pierwszej od lewej grupy bitow, =

ktora zawiera chociaz jeden bit niezerowy (wykrycie takiego bitu oznacza=
my =

przez nadane zmiennej hit wartosci 1). Wynik bedzie "informatyczny" czyl=
i =

KB =3D 1024 B, MB =3D 1024*1204 B. Teraz napisze, co oznaczaja zmienne:

Zmienna power1024 ma wartosc:

3 dla bitu z grupy g,
2 dla bitu z grupy m,
1 dla bitu z grupy k,
0 dla bitu z grupy b,

ggmmmmmmmmmmkkkkkkkkkkbbbbbbbbbb
33222222222211111111110000000000 <- power1024

Zmienna bit10 oznacza numer bitu w ramach grupy bitow, liczony w lewo. =

Poczatkowa wartosc to 1, bo zaczynamy analize bitow od lewej strony, a =

grupa bitow typu g ma tylko 2 bity:

ggmmmmmmmmmmkkkkkkkkkkbbbbbbbbbb
10987654321098765432109876543210 <- bit10

Zmienna byte oznacza nr bajtu zadanej liczby 32-bitowej, czyli tak:

ggmmmmmmmmmmkkkkkkkkkkbbbbbbbbbb
33333333222222221111111100000000 <- byte

Jak juz wiesz, co znacza te zmienne, to powinno byc latwiej przesledzic,=
=

jak dziala algorytm.

Irek

Kamil

4/20/2013 7:55:00 AM

0

U??ytkownik "Ireneusz Szpilewski" napisa??:

> Takie cos ponizej wysmazylem ...

> #include <stdio.h>

To jest asembler? Czy na tej grupie s?? juz same g??upki?

BZPZDR