
2                  # Litera liczbowy.
x                  # Odwoanie do zmiennej lokalnej.
Math.sqrt(2)       # Wywoanie metody.
x = Math.sqrt(2)   # Przypisanie.
x*x                # Mnoenie za pomoc operatora *.

one = 1.0     # Wyraenie przypisania.
one           # Niniejsze wyraenie odwoania do zmiennej daje warto 1.0.

a = 0.0 if false    # To przypisanie nie jest nigdy wykonywane.
print a             # Drukuje nil: zmienna istnieje, ale nie ma przypisanej wartoci.
print b             # NameError: nie ma zmiennej ani metody o nazwie b.

CM_PER_INCH = 2.54  # Definicja staej.
CM_PER_INCH         # Odwoanie do staej. Warto 2.54.

Conversions::CM_PER_INCH # Staa zdefiniowana w module Conversions.
modules[0]::NAME         # Staa zdefiniowana przez element tablicy.

Conversions::Area::HECTARES_PER_ACRE

::ARGV      # Staa globalna ARGV.

puts "witaj"        # Metoda puts wywoana na rzecz self z jednym argumentem acuchowym.
Math.sqrt(2)        # Metoda sqrt wywoana na rzecz obiektu Math z jednym argumentem.
message.length      # Metoda length wywoana na rzecz obiektu message; brak argumentw.
a.each {|x| p x }   # Metoda each wywoana na rzecz obiektu a z doczonym blokiem.

message.length=(3)    # Zwyke wywoanie metody.
message.length = 3    # Wywoanie metody wygldajce jak przypisanie.

a[0]

a.[](0)

x = 1     # Ustawienie wartoci x na 1.

x += 1    # Ustawienie l-wartoci x na warto x + 1.

x,y,z = 1,2,3   # Ustawienie x na 1, y na 2 i z na 3.

x = y = 0   # Ustawienie x i y na 0.

x + y
Math.sqrt(2)

x = 1       # Wpywa na warto innych wyrae, ktre uywaj zmiennej x.
x += 1      # Zwraca za kadym razem inn warto.

point.x, point.y = 1, 2

class Ambiguous
  def x; 1; end # Metoda o nazwie x. Zawsze zwraca warto 1.
  def test
    puts x      # Nie znaleziono adnej zmiennej; odwouje si do powyszej metody i drukuje 1.
    # Warto poniszego wiersza kodu nie jest nigdy obliczana ze wzgldu na klauzul if false.
    # Jednak interpreter widzi go i traktuje x jako zmienn w pozostaej czci tej metody.
    x = 0 if false
    puts x    # x jest zmienn, ale nigdy nie przypisano mu wartoci  drukuje nil.
    x = 2     # Niniejsze przypisanie zostanie obliczone.
    puts x    # Dlatego niniejsza instrukcja wydrukuje 2.
  end
end

N = 100 if false

o.m = v

o.m=(v)  # Jeli zostan opuszczone nawiasy i dodana spacja, wyraenie to bdzie wyglda jak przypisanie!

o.[]=(x,y)
o[x,y] = z
o.[]=(x,y,z)

x += 1

x = x + 1

o.m += 1
o.m=(o.m()+1)

o[x] -= 2
o.[]=(x, o.[](x) - 2)


results ||= []

results = results || []


x, y, z = 1, 2, 3   # x=1; y=2; z=3

x,y = y,x     # Rwnolege  zamiana wartoci dwch zmiennych.
x = y; y = x  # Sekwencyjne  obie zmienne maj t sam warto.

x = 1, 2, 3      # x = [1,2,3].

x, = 1, 2, 3     # x = 1; pozostae wartoci s odrzucane.

x, y, z = [1, 2, 3]  # To samo, co x,y,z = 1,2,3

x = [1,2]    # x ma warto [1,2]: to nie jest przypisanie rwnolege.
x, = [1,2]   # x ma warto 1: przecinek na kocu sprawia, e jest to przypisanie rwnolege.

x, y, z = 1, 2  # x=1; y=2; z=nil

x, y = 1, 2, 3 # x=1; y=2; 3 nie zostaje przypisana nigdzie.

x, y, z = 1, *[2,3]  # To samo, co x,y,z = 1,2,3.

x,y = **[[1,2]]   # SyntaxError!

x,*y = 1, 2, 3  # x=1; y=[2,3]
x,*y = 1, 2     # x=1; y=[2]
x,*y = 1        # x=1; y=[]

# Tylko Ruby 1.9.
*x,y = 1, 2, 3  # x=[1,2]; y=3
*x,y = 1, 2     # x=[1]; y=2
*x,y = 1        # x=[]; y=1

x, y, *z = 1, *[2,3,4]  # x=1; y=2; z=[3,4].

x,(y,z) = a, b

x = a
y,z = b

x,y,z = 1,[2,3]             # Brak nawiasw: x=1;y=[2,3];z=nil.
x,(y,z) = 1,[2,3]           # Nawiasy: x=1;y=2;z=3.
a,b,c,d = [1,[2,[3,4]]]     # Brak nawiasw: a=1;b=[2,[3,4]];c=d=nil.
a,(b,(c,d)) = [1,[2,[3,4]]] # Nawiasy: a=1;b=2;c=3;d=4.

puts x,y=1,2

puts (x,y=1,2)

2 * Math.sqrt(2) < limit

1 + 2 * 3     # => 7.

(1 + 2) * 3   # => 9.

ri 'String.*'

(0b1011 << 1).to_s(2)   # => "10110"   11 << 1 => 22.
(0b10110 >> 2).to_s(2)  # => "101"     22 >> 2 => 5.

message = "witaj"        # acuch.
messages = []            # Pusta tablica.
message << " swiecie"    # Doczenie do acucha.
messages << message      # Doczenie komunikatu do tablicy.
STDOUT << message        # Wydruk komunikatu w standardowym strumieniu wyjciowym.

(0b1010 & 0b1100).to_s(2)  # => "1000".

(0b1010 | 0b1100).to_s(2)  # => "1110".

(0b1010 ^ 0b1100).to_s(2)  # => "110".

# Deklaracja klasy A jako podklasy klasy B.
class A < B
end

String < Object        # true: Klasa String jest bardziej wyspecjalizowana ni Object.
Object > Numeric       # true: Klasa Object jest bardziej oglna ni klasa Numeric.
Numeric < Integer      # false: Klasa Numeric nie jest bardziej wyspecjalizowna od klasy Integer.
String < Numeric       # nil: Klasy String i Numeric nie s powizane ze sob.

x == 0 && y > 1

x && y

x && print(x.to_s)

x < 0 || y < 0 || z < 0   # Czy ktra ze wsprzdnych ma ujemn warto?

# Jeli argument x ma warto nil, nastpuje pobranie jego wartoci z tablicy asocjacyjnej preferencji uytkownika
# lub domylnej wartoci zapisanej w staej.
x = x || preferences[:x] || Defaults::X

1 || 2 && nil     # => 1

(1 || 2) && nil   # => nil

!(a && b)

!a || !b

if x > 0 and y > 0 and not defined? d then d = Math.sqrt(x*x + y*y) end

if a = f(x) and b = f(y) and c = f(z) then d = g(a,b,c) end

x || y && nil        # Najpierw jest wykonywany operator && => x.
x or y and nil       # Wykonywane od lewej do prawej => nil.

x+1..x*x

Range.new(x,y)

Range.new(x,y,true)

(1..10).each {|x| print x if x==3..x==5 }

# Drukuje "3". Zmienia stan i wraca do pierwotnego stanu, kiedy x==3.
(1..10).each {|x| print x if x==3..x>=3 }
# Drukuje "34". Zmienia stan, kiedy x == 3, i wraca do pierwotnego, kiedy x==4.
(1..10).each {|x| print x if x==3...x>=3 } # Drukuje "34".

ARGF.each do |line|   # Dla kadej linii na wejciu lub wymienionych plikw.
  print line if line=~/TODO/..line=~/^$/ # Drukowanie linii, kiedy przerzutnik jest w stanie true.
end

$state = false            # Globalna zmienna przechowujca stan przerzutnika.
def flipflop(x)           # Sprawdzenie wartoci zmiennej x wzgldem przerzutnika.
  if !$state              # Jeli zapisany stan to false,
    result = (x == 3)     # wynikiem jest warto lewego operandu.
    if result             # Jeli wynik ten to true,
      $state = !(x == 5)  # to zapisany stan nie pochodzi od prawego operandu.
    end
    result                # Zwrot wyniku.
  else                    # W przeciwnym przypadku, jeli zapisany stan to true,
    $state = !(x == 5)    # zapisanie odwrotnoci prawego operandu
    true                  # i zwrot wartoci true bez sprawdzania wartoci lewego operandu.
  end
end

(1..10).each {|x| print x if flipflop(x) }

$state2 = false
def flipflop2(x)
  if !$state2
    $state2 = (x == 3)
  else
    $state2 = !(x >= 3)
    true
  end
end
# Sprawdzenie dziaania funkcji.
(1..10).each {|x| print x if x==3...x>=3 }  # Drukuje "34".
(1..10).each {|x| print x if flipflop2(x) } # Drukuje "34".

"Masz #{n} #{n==1 ? 'wiadomo' : 'wiadomoci'}"

x==3?y:z      # To jest dozwolone.
3==x?y:z      # Bd skadni: x? jest interpretowane jako nazwa metody.
(3==x)?y:z    # OK: nawiasy rozwizuj problem.
3==x ?y:z     # Spacje rwnie rozwizuj problem.

a ? b : c ? d : e    # To wyraenie...
a ? b : (c ? d : e)  # jest obliczane w taki sposb..
(a ? b : c) ? d : e  # NIE w taki.

max = x>y ? x>z ? x : z : y>z ? y : z
max = x>y ? (x>z ? x : z) : (y>z ? y : z)  # Z nawiasami.

x = y = z = 0      # Przypisanie zera do zmiennych x, y i z.
x = (y = (z = 0))  # Niniejszy wyraenie pokazuje kolejno wykonywania dziaa.


# Obliczenie f(x), ale tylko, jeli f i x s zdefiniowane.
y = f(x) if defined? f(x)

defined? a and defined? b    # To dziaa.
defined? a && defined? b     # Obliczane jako: defined?((a && defined? b)).

print x if x
