Co to jest za znak?

Witam

Chodzi mi o coś takiego: “|=”. występuje to w C++, ale nie wiem czy w Ruby’m również. Jeżeli nie ma go w Ruby’m to jak go zastąpić.

w Ryby jest x ||= y , oznacza to jeśli x jest niezainicjalizowane to przypisz y a jeśli jest, to nic nie rób

Tak jak

a += 1

jest równoważne

a = a + 1

to

a ||= 1

jest równoważne

a = a || 1

czyli inaczej: przypisz do A wynik wyrażenia (a || 1)

wyrażenie a || 1 zwraca A, jeśli a jest prawdziwe LUB 1

w Ruby wszystko jest prawdziwe poza false i nil

Mam nadzieję, że rozjaśniłem a nie namieszałem :wink:

@dies_natalis, polecam odpalenie irb i po prostu spróbowanie. :slight_smile: Operatory bitowe działą w Ruby identycznie jak w C++.

ruby-1.9.1-p378 > a = 0 => 0 ruby-1.9.1-p378 > a |= 2 => 2 ruby-1.9.1-p378 > a |= 1 => 3 ruby-1.9.1-p378 > a |= 8 => 11

hekto5 +1, to był operator bitowy a nie logiczny :wink:

Dodam, że | jest zdefiniowane również dla innych klas, np. dla Array działa jak suma teoriomnogościowa:

[code=ruby]a = [1, 2, 3, 3]
b = [3,3,4]
a |= b

[1, 2, 3, 4][/code]

Zwłaszcza na tablicach :wink:

Wszystkim bardzo dziękuję za odpowiedzi. Nie spodziewałam się, że będzie ich aż tyle :slight_smile:

Spok, społeczność forum jest bardzo pomocna, chyba że przychodzisz z czymś bardzo oczywistym :wink:

Mam kolejne pytanie i może zadam je w moim temacie bo również chodzi znak, a mianowicie w C++ jest coś takiego:
double odleglosc(int *mx, int *my, int m) <-- a dokładnie chodzi mi o zmienne *mx i *my. Czym to zastąpić w Ruby’m?

I jeszcze jedno (mam nadzieję, że ostatnie - niestety przerabiam program z C++ na Ruby’ego i strasznie mnie to wkurza po przerabiam linijkę po linijce, a wiem , że można go skrócić o połowę, ale niestety nie umiem na tyle Ruby’ego aby to zrobić, a po drugie niezbyt mam czas) w C++ mam coś takiego:
“for (i++, j = max; i < j; i++, j–) {
k = t[i - 1];
t[i - 1] = t[j - 1];
t[j - 1] = k;
}”
W nawiasie po for’ze są dwie zmienne i one mają się zmieniać jednocześnie. Jak wykonać to w Ruby’m?

[quote=dies_natalis]Mam kolejne pytanie i może zadam je w moim temacie bo również chodzi znak, a mianowicie w C++ jest coś takiego:
double odleglosc(int *mx, int *my, int m) <-- a dokładnie chodzi mi o zmienne *mx i *my. Czym to zastąpić w Ruby’m?[/quote]
W C++ możesz przekazać w ten sposób wskaźnik na zmienną, a nie jej wartość. W Ruby nie ma takiej konstrukcji, więc najlepiej jak wkleisz całą funkcję, wtedy będzie nam łatwiej podać Ci alternatywną implementację.

[quote=dies_natalis]I jeszcze jedno (mam nadzieję, że ostatnie - niestety przerabiam program z C++ na Ruby’ego i strasznie mnie to wkurza po przerabiam linijkę po linijce, a wiem , że można go skrócić o połowę, ale niestety nie umiem na tyle Ruby’ego aby to zrobić, a po drugie niezbyt mam czas) w C++ mam coś takiego:
“for (i++, j = max; i < j; i++, j–) {
k = t[i - 1];
t[i - 1] = t[j - 1];
t[j - 1] = k;
}”
W nawiasie po for’ze są dwie zmienne i one mają się zmieniać jednocześnie. Jak wykonać to w Ruby’m?[/quote]
To akurat mnie osobiście rozłożyło na łopatki, kiedy pierwszy raz zobaczyłem:

a, b = b, a

:slight_smile:

Ok, to podam całą funkcję:

double odleglosc(int *mx, int *my, int m) { int i; double suma=0; for(i=0;i<m-1;i++) { suma+=sqrt((mx[i+1]-mx[i])*(mx[i+1]-mx[i])+(my[i+1]-my[i])*(my[i+1]-my[i])); } return suma; }

Aha, czyli mx i my to tablice położeń.

W Ruby tablice (obiekty klasy Array) są przekazywane przez referencję (czyli tak-jak-przez-wskaźnik, bez robienia kopii), czyli można spokojnie

def odleglosc(mx, my, m) suma = 0 0.upto(m-1) do suma += ... ...
Swoją drogą bardziej object-oriented byłoby (przynajmniej) przekazanie tablicy obiektów klasy Point, z których każdy o dostępnych zmiennych instancyjnych x i y (na przykład).