Nowy w rubinie, załóż rękawiczki dla początkujących.
Czy jest jakaś różnica (niejasna lub praktyczna) między następującymi dwoma fragmentami?
my_array = [:uno, :dos, :tres]
my_array.each { |item|
puts item
}
my_array = [:uno, :dos, :tres]
my_array.each do |item|
puts item
end
Zdaję sobie sprawę, że składnia nawiasów klamrowych pozwoliłaby umieścić blok w jednej linii
my_array.each { |item| puts item }
ale poza tym, czy są jakieś istotne powody, by używać jednej składni zamiast drugiej?
ruby
coding-style
Alan Storm
źródło
źródło
each
pracy z nawiasami, ale nie zdo
-end
(ruby) , Definicja bloku - różnica między nawiasami klamrowymi ido
-end
? , Wielowierszowy blok Ruby bezdo
end
, Jaka jest różnica lub wartość tych stylów kodowania blokowego w Rubim? i blok Ruby i argumenty nieprzedstawione .Odpowiedzi:
Książka kucharska Ruby mówi, że składnia nawiasów ma wyższy priorytet niż
do..end
Drugi przykład działa tylko wtedy, gdy używany jest nawias,
1.upto(3) { |x| puts x }
źródło
To trochę stare pytanie, ale chciałbym spróbować wyjaśnić nieco więcej na temat
{}
ido .. end
jak zostało powiedziane wcześniej
ale jak to robi różnicę:
w tym przypadku metoda1 zostanie wywołana z blokiem,
do..end
a metoda2 zostanie przekazana do metody method1 jako argument! co jest równoważne zmethod1(method2){ puts "hi" }
ale jeśli powiesz
wtedy metoda2 zostanie wywołana z blokiem, a następnie zwrócona wartość zostanie przekazana do metody method1 jako argument. Co jest równoważne
method1(method2 do puts "hi" end)
#### wynik ####
źródło
Ogólnie rzecz biorąc, konwencja jest używana,
{}
gdy wykonujesz małą operację, na przykład wywołanie metody lub porównanie itp., Więc ma to sens:Ale jeśli masz nieco złożoną logikę, która prowadzi do wielu linii, użyj
do .. end
:Zasadniczo sprowadza się to do tego, że jeśli twoja logika blokowa przechodzi do wielu linii i nie można jej dopasować do tej samej linii, użyj,
do .. end
a jeśli twoja logika blokowa jest prosta i tylko prosta / pojedyncza linia kodu, użyj{}
.źródło
result_with_some_condition = method{|c| c.do_something || whateever}; result_with_some_condition.another_method
ponieważ dzięki temu jest to trochę łatwiejsze do zrozumienia. Ale generalnie unikałbym katastrofy pociągu.Istnieją dwa popularne style wybierania
do end
i{ }
blokowania w Rubim:Pierwszy i bardzo popularny styl został spopularyzowany przez Ruby on Rails i opiera się na prostej zasadzie pojedynczej i wieloliniowej:
{ }
dla bloków jednowierszowychdo end
do bloków wieloliniowychMa to sens, ponieważ do / end czyta źle w jednowierszowym, ale w przypadku bloków wieloliniowych, pozostawienie zamknięcia
}
wiszącego w osobnym wierszu jest niespójne ze wszystkim innym, co używaend
w ruby, takim jak definicje modułów, klas i metod (def
itp. zwalczania.) i (if
,while
,case
etc.)Drugi, rzadziej spotykany styl znany jest jako semantyczny lub „ Weirich Braces ”, zaproponowany przez nieżyjącego już, wielkiego rubinisty Jima Weiricha:
do end
do bloków proceduralnych{ }
do bloków funkcjonalnychOznacza to, że gdy blok jest oceniany pod kątem wartości zwracanej , powinien być możliwy do utworzenia łańcucha, a
{}
nawiasy klamrowe mają większy sens w przypadku łączenia metod.Z drugiej strony, gdy blok jest oceniany pod kątem skutków ubocznych , zwracana wartość nie ma żadnego znaczenia, a blok po prostu coś „robi”, więc nie ma sensu być łączonym w łańcuch.
To rozróżnienie w składni przekazuje wizualne znaczenie oceny bloku i tego, czy należy dbać o jego zwracaną wartość.
Na przykład tutaj wartość zwracana bloku jest stosowana do każdego elementu:
Jednak tutaj nie używa wartości zwracanej przez blok. To działa proceduralnie, a robi to efekt uboczny z nim:
Kolejną zaletą stylu semantycznego jest to, że nie trzeba zmieniać nawiasów klamrowych na wykonanie / zakończenie tylko dlatego, że do bloku dodano wiersz.
Z obserwacji wynika, że przypadkowo bloki funkcjonalne są często jednowierszowe, a bloki proceduralne (np. Config) są wieloliniowe. Więc podążanie za stylem Weiricha wygląda prawie tak samo jak styl Rails.
źródło
Używałem stylu Weirich przez lata, ale po prostu odszedłem od tego, aby zawsze używać aparatu ortodontycznego . Nie pamiętam, żebym kiedykolwiek używał informacji ze stylu bloku, a definicja jest trochę niejasna. Na przykład:
Czy są one prokudowe czy funkcjonalne?
A liczenie linii jest moim zdaniem bezużyteczne. Wiem, czy jest 1 lub więcej linii i dlaczego dokładnie powinienem zmienić styl tylko dlatego, że dodałem lub usunąłem linie?
źródło