Ruby to znany język programowania. Jego celem jest zwiększenie prostoty i produktywności. Jest to również w pełni obiektowy język programowania. Ponadto Ruby charakteryzuje się elegancką składnią, która jest naturalna do czytania i łatwa do pisania.
Każde programowanie wymaga zarządzania różnymi typami danych. Typ danych opisuje określoną klasę danych. Informuje maszynę, jak powinna traktować dane w programie. Typy danych są kluczowe dla określenia, co można zrobić z danymi (w tym operacji, które można na nich wykonać). W tym samouczku zagłębimy się w typy danych dostępne w języku Ruby. Przyjrzymy się również dynamicznemu typowaniu. Dzięki tej funkcji Ruby może automatycznie określić typ danych zmiennej bez jej jawnego deklarowania. Zaczynajmy!
Wymagania wstępne
Aby przećwiczyć i wdrożyć kroki przedstawione w tym przewodniku, będziesz potrzebować następujących komponentów:
- Odpowiednio skonfigurowanego systemu Linux. Dowiedz się więcej o konfiguracji osobistego serwera Ubuntu na CloudSigma.
- Odpowiednio skonfigurowanego środowiska programistycznego Ruby. Sprawdź oficjalną dokumentację instalacji Ruby na Ubuntu (przy użyciu APT).
Typy danych w Ruby
Ruby oferuje wszystkie popularne typy danych, które można spotkać w każdym języku programowania: liczby całkowite, liczby zmiennoprzecinkowe, ciągi znaków, tablice, symbole, hashe itp. Następnie przedstawimy omówienie sposobu pracy z różnymi typami danych w języku Ruby.
Krok 1 – Liczby całkowite
Podobnie jak w matematyce, liczby całkowite w programowaniu komputerowym to liczby całkowite. Wartość może być dodatnia, ujemna lub wynosić 0. Zakres wartości jest następujący:
|
1 |
{-∞, …, -1, 0, 1, …, ∞} |
Czas wypróbować liczby całkowite w Ruby. Pierwszym przykładem jest wyświetlenie prostej liczby całkowitej na ekranie:
|
1 2 |
print 99 print "\n" |
Następnie będziemy pracować ze zmienną typu całkowitego. Tutaj zmienna sample_int zawiera wartość całkowitą (99), a funkcja print wypisuje wartość zmiennej na ekranie:
|
1 2 3 |
sample_int = 99 print sample_int print "\n" |
Możemy również wykonywać operacje matematyczne na liczbach całkowitych. Poniższy przykład pokazuje proste dodawanie dwóch liczb całkowitych:
|
1 2 3 |
sample_int = 99 + 100 print sample_int print "\n" |
Kiedy pracujemy z dużymi liczbami, często używamy przecinków (,), aby ułatwić ich czytanie. Na przykład jeden milion (1000000) jest zapisywany jako 1,000,000 dla lepszej czytelności. Chociaż używanie przecinków jest zabronione, Ruby pozwala na używanie podkreśleń ( _) jako separatora. Spójrz na poniższy przykład:
|
1 2 3 |
sample_int = 1_000_999 print sample_int print "\n" |
Używanie podkreśleń poprawia czytelność kodu, szczególnie w przypadku dużych wartości całkowitych.
Krok 2 – Liczby zmiennoprzecinkowe
Liczba zmiennoprzecinkowa (lub w skrócie float) reprezentuje liczbę rzeczywistą. Podobnie jak w definicji matematycznej, liczby rzeczywiste mogą być wymierne lub niewymierne. W Ruby float to zasadniczo liczba zawierająca kropkę dziesiętną.
Spróbujmy wyświetlić wartość zmiennoprzecinkową na ekranie:
|
1 2 |
print 55.66 print "\n" |
Kolejny przykład pokazuje deklarowanie zmiennej zmiennoprzecinkowej:
|
1 2 3 |
sample_float = 55.66 print sample_float print "\n" |
Możemy również wykonywać różne operacje matematyczne na wartościach i zmiennych zmiennoprzecinkowych. Poniższy przykład pokazuje proste dodawanie dwóch liczb zmiennoprzecinkowych:
|
1 2 3 |
sample_float = 55.66 + 99.222 print sample_float print "\n" |
Co jeśli dodamy liczbę zmiennoprzecinkową i całkowitą? Wynikowa wartość będzie liczbą zmiennoprzecinkową. W poniższym przykładzie, mimo że 55.0 jest liczbą całkowitą, jest traktowana jako float:
|
1 2 3 |
sample_float = 55.0 + 10 print sample_float print "\n" |
Krok 3 – Boolean
Wartości logiczne reprezentują wartości prawdy w dziale logiki matematycznej. W Ruby logiczne typy danych są reprezentowane przez dwie wartości: true oraz false:
-
Większe niż
-
100 > 99: true
-
99 > 100: false
-
-
Mniejsze niż
-
500 < 999: true
-
999 < 500: false
-
-
Równe
-
10 == 10: true
-
9 == 99: false
-
Podobnie jak liczby, możemy również przechowywać true lub false wartość w zmiennej. Poniższy przykład demonstruje tę funkcję:
|
1 2 3 |
result = 9 == 99 print result print "\n" |
Step 4 – Ciągi znaków
W programowaniu ciąg znaków jest reprezentowany jako sekwencja znaków (liter, cyfr i symboli). W języku Ruby ciągi znaków występują w pojedynczych cudzysłowach ( ') lub podwójnych cudzysłowach ( "). Już szczegółowo omówiliśmy używanie ciągów znaków w Ruby, więc będzie to krótka sekcja.
Poniższy przykład to podstawowy program hello world w języku Ruby:
|
1 |
print "hello world!\n" |
Możemy również przechowywać ciągi znaków w zmiennych. Poniższy przykład obejmuje także konkatenację ciągów znaków:
|
1 2 |
username = "Cloudsigma" print "hello, " + username + "!\n" |
Step 5 – Tablice
Tablica to struktura danych, która może przechowywać kolekcję elementów tego samego typu o stałym rozmiarze. Można ją również wyobrazić sobie jako kolekcję zmiennych tego samego typu danych. Jest to jedna z najbardziej podstawowych struktur danych w większości nowoczesnych języków programowania.
W języku Ruby tablicę definiuje się w następujący sposób:
|
1 |
[value_1, value_2, …, value_N] |
Możliwe jest utworzenie tablicy dowolnych innych typów danych, które omówiliśmy do tej pory (liczby całkowite, zmiennoprzecinkowe i ciągi znaków). Oto kilka przykładów:
-
Liczby całkowite: [-5, 0, 5]
-
Liczby zmiennoprzecinkowe: [-9.99, -6.99, -3.99, 0, 3.99]
-
Ciągi znaków: [“the”, “quick”, “brown”, “fox”]
Poniższy przykład implementuje wszystkie te typy tablic:
|
1 2 3 4 5 6 |
print [-5, 0, 5] print "\n" print [-9.99, -6.99, -3.99, 0, 3.99] print "\n" print ["the", "quick", "brown", "fox"] print "\n" |
Zauważ, że gdy funkcja print napotka tablicę, wypisuje całą tablicę na ekranie. Dla większej wygody często będziesz spotykać tablice jako zmienne. Zaktualizujmy kod:
|
1 2 3 4 5 6 7 8 9 10 |
array_int = [-5, 0, 5] print array_int print "\n" array_float = [-9.99, -6.99, -3.99, 0, 3.99] print array_float print "\n" array_string = ["the", "quick", "brown", "fox"] print array_string print "\n" |
Teraz możemy pracować z poszczególnymi elementami tablic:
|
1 2 3 4 5 6 7 8 9 |
array_int = [-5, 0, 5] print array_int[2] print "\n" array_float = [-9.99, -6.99, -3.99, 0, 3.99] print array_float[1] print "\n" array_string = ["the", "quick", "brown", "fox"] print array_string[3] print "\n" |
Zauważ, że w języku Ruby indeksowanie tablic zaczyna się od 0.
Dla wygody tablice w języku Ruby posiadają metody .first oraz .last, które wypisują pierwszy i ostatni element:
|
1 2 3 4 |
array_float = [-9.99, -6.99, -3.99, 0, 3.99] puts array_float.first puts array_float.last print "\n" |
W języku Ruby tablice mają jeszcze jedną ciekawą cechę. Mogą przechowywać różne typy danych jednocześnie. Na przykład można w nich przechowywać ciągi znaków, symbole, a nawet inne tablice:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
mixed_array = [ "hello", 99.99, "world", [ "the", "quick", "brown", "fox" ] ] print mixed_array print "\n" print mixed_array[3] print "\n" |
Krok 6 – Symbole
W języku Ruby, symbol to specjalny typ danych, który działa jak etykieta lub identyfikator. Symbole są niezmienne, co oznacza, że nie można ich zmienić. Symbole wyglądają tak, jakby deklarowano zmienne bez żadnej wartości.
Oto przykład symbolu:
|
1 |
:time_zone |
Zazwyczaj symbole są używane do identyfikowania czegoś ważnego. W innych sytuacjach jednak łańcuchy znaków są w zupełności wystarczające.
Ruby, będąc językiem obiektowym, traktuje wszystko jako obiekt (w tym łańcuchy znaków) z jego unikalną lokalizacją w pamięci, nawet jeśli te łańcuchy są identyczne. Jednak kiedy odwołujesz się do symbolu, jest to ten sam obiekt w każdym miejscu programu, ta sama lokalizacja w pamięci.
Krok 7 – Hashe
Hash to przypominająca słownik kolekcja kluczy i wartości. Często hashe są używane do przechowywania powiązanych danych, na przykład informacji o użytkowniku.
Oto szybki przykład hasha. Utworzyliśmy hash user_info zawierający nazwę użytkownika i hasło użytkownika:
|
1 2 3 4 5 6 |
user_info = { "username" => "HelloWorld999", "password" => "password123" } print user_info print "\n" |
Aby pobrać wartości pary klucz-wartość, musimy użyć klucza. Poniższy przykład demonstruje ten proces:
|
1 2 3 4 5 6 7 |
user_info = { "username" => "HelloWorld999", "password" => "password123" } print user_info["username"] print "\n" |
Ruby pozwala również na definiowanie hasha przy użyciu nieco innej składni ( : zamiast =>):
|
1 2 3 4 5 6 |
user_info = { username: "HelloWorld999", password: "password123" } print user_info[:password] print "\n" |
Ta struktura składniowa jest podobna do składni używanej w innych językach, na przykład JavaScript. W tej strukturze składniowej klucze są zdefiniowane jako symbole. Dlatego zamiast używać "username", używamy: username aby uzyskać dostęp do wartości.
Typowanie dynamiczne
Być może zauważyłeś już, że podczas deklarowania zmiennej nie musimy jawnie przypisywać typu danych. Zamiast tego typ danych określa wartość zmiennej. Ruby używa dynamicznego typowania, w którym sprawdzanie typów odbywa się w czasie wykonywania. Dla kontrastu, typy danych są określane podczas kompilacji w statycznie typowanych językach programowania (na przykład C/C++).
W poniższym przykładzie wszystkie wartości przypisane do zmiennej dyn_var są prawidłowe:
|
1 2 3 4 5 |
dyn_var = 123 dyn_var = 456.789 dyn_var = true dyn_var = "the quick brown fox" dyn_var |
W językach z dynamicznym typowaniem możemy swobodnie użyć ponownie istniejącej zmiennej do przechowywania różnych typów danych. Tutaj poprzedni przykład został zaktualizowany, aby zademonstrować to zjawisko:
|
1 2 3 4 5 6 7 |
dyn_var = 123 puts dyn_var dyn_var = 456.789 dyn_var = true dyn_var = "the quick brown fox" puts dyn_var dyn_var |
Jak pokazuje ten przykład, za każdym razem, gdy przypisywana jest nowa wartość, zmienia to typ danych zmiennej dyn_var na bieżąco. Jest to przydatne przy konwersji jednego typu danych na inny. Poniższy przykład to demonstruje:
|
1 2 3 4 |
print "enter length: " length = gets.chop length = length.to_f puts length |
Tutaj,
-
Ponieważ dane wejściowe z klawiatury są łańcuchami znaków, length jest na początku łańcuchem znaków.
-
Ponieważ naszą pożądaną wartością jest liczba zmiennoprzecinkowa, konwertujemy wartość tekstową na liczbę zmiennoprzecinkową za pomocą to_f metody.
-
Z powodu zmiany wartości, length ma przypisany zmiennoprzecinkowy typ danych. To właśnie widzimy podczas wypisywania jej wartości na ekranie.
Co by się stało, gdybyśmy spróbowali połączyć dwa różne typy danych? Ruby zgłosi błąd. Spójrz:
|
1 |
print 9 + "77" |
Identyfikacja typów danych
W języku Ruby wszystko jest traktowane jako obiekt. Każdy obiekt w Ruby posiada metodę class. Po wywołaniu ta metoda informuje, jakiego typu danych jest źródło. Oto kilka przykładów użycia metody class:
|
1 2 3 4 |
puts 55.class puts (55.55).class puts true.class puts nil.class |
Innym sposobem na określenie typu danych jest użycie metody kind_of?. Sprawdza ona typ danych obiektu pod kątem żądanego typu danych i zwraca wartość logiczną. Zobacz to w poniższym przykładzie:
|
1 2 |
puts 55.kind_of?(Float) puts 55.kind_of?(Integer) |
Podobnie, istnieje inna metoda is_a?, która porównuje typ danych i zwraca wartość logiczną. Jedyną różnicą jest nazwa metody. Może być ona jednak preferowana, ponieważ jest nieco łatwiejsza do odczytania i zrozumienia dla programistów. Zaktualizuj poprzedni przykład za pomocą is_a?:
|
1 2 |
puts 55.is_a?(Float) puts 55.is_a?(Integer) |
Podsumowanie
Praca z dowolnym językiem programowania wymaga dobrego zrozumienia obsługiwanych przez niego typów danych. W tym przewodniku zbadaliśmy najpopularniejsze typy danych używane w programowaniu w Ruby. Omówiliśmy i zademonstrowaliśmy liczby całkowite, liczby zmiennoprzecinkowe, ciągi znaków, symbole, wartości logiczne i hashe (wraz z przykładami).
Zapoznaj się z innymi poradnikami na naszym blogu, które pomogą Ci poznać Ruby:
- Instalacja Ruby on Rails za pomocą RVM na Ubuntu 20.04
- Konfiguracja Ruby on Rails z PostgreSQL
- Używanie MySQL z aplikacją Ruby on Rails na Ubuntu 21.04
- Poznaj CloudSigma PaaS: Jak korzystać z usług hostingu Ruby PaaS?
Miłego kodowania!




































Komentarze
Brak komentarzy. Bądź pierwszy.