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ć.
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
@dies_natalis, polecam odpalenie irb i po prostu spróbowanie. 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
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
Zwłaszcza na tablicach
Wszystkim bardzo dziękuję za odpowiedzi. Nie spodziewałam się, że będzie ich aż tyle
Spok, społeczność forum jest bardzo pomocna, chyba że przychodzisz z czymś bardzo oczywistym
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
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).