Używanie „lub” jest niebezpieczne. „lub” ma niższą presendencję operatora niż „=”, więc następujące zachowanie jest nieoczekiwane: a = fałsz lub prawda #a jest fałszem po tym stwierdzeniu
Tom G
20
@xiy obecnie przewodnik zaleca udawanie lub i i nie istnieje (|| czy to lub && i?)
user3125280,
67
Obecne „Przewodnik po stylu Ruby” The and and or keywords are banned. It's just not worth it. Always use && and || instead.. I słusznie, z powodów Davida i Toma.
Andre Figueiredo
40
classObjectdef nil_zero?self.nil?||self==0endend# which lets you donil.nil_zero?# returns true0.nil_zero?# returns true1.nil_zero?# returns false"a".nil_zero?# returns falseunless discount.nil_zero?# do stuff...end
Uważaj na zwykłe zrzeczenia się odpowiedzialności ... wielką moc / odpowiedzialność, łatanie małp prowadzące do ciemnej strony itp.
Zauważ, że jest to odpowiedź specyficzna dla torów . Rubin waniliowy nie ma trymetody.
Tom Lord,
Poprawny. Chociaż jest bardziej podobny do ActiveSupport, która jest znacznie lżejszą i szeroko stosowaną zależnością niż pełne szyny. W każdym razie odpowiedź @ ndn jest właściwa.
przepisany
Edytowano, aby korzystać z bezpiecznej nawigacji
przepisano
1
Odpowiedź duplikuje teraz stackoverflow.com/a/34819818/1954610 ... Myślę, że pozostawienie jej ma wartość, ponieważ trypokazuje alternatywną opcję (dlatego właśnie została oceniona!), O ile jest to jasne czytelnik, który ActiveSupportnie jest waniliowym rubinem.
Uważam to za doskonale czytelne i wolałbym to niż nową klasę. Dobra robota.
colincr
Najbardziej rubinowe podejście do radzenia sobie z dwoma warunkami.
Yugendran,
23
Począwszy od Ruby 2.3.0, możesz łączyć bezpieczny operator nawigacji ( &.) z Numeric#nonzero?. &.zwraca, niljeśli instancja była nili nonzero?- jeśli liczba była 0:
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String.... Nie można bezpiecznie używać na dowolnych obiektach.
Tom Lord,
2
@TomLord, jak stwierdzono w poprzednim komentarzu, nie było przeznaczone do pracy z dowolnymi obiektami. Zamiast tego chodzi o przypadek, gdy masz coś, o czym wiesz, że powinna to być liczba, ale może też być nil.
ndnenkov
Wyjaśniłbym ten fakt w odpowiedzi, a nie ktoś przeczytał to i nie zauważył wyłączenia odpowiedzialności w komentarzach.
Tom Lord,
@TomLord, jest to określone w odpowiedzi „ nonzero?- jeśli liczba była 0” . Konieczność sprawdzenia, czy powstaje całkowicie dowolny obiekt, 0pojawia się niezwykle rzadko w porównaniu z tym, aby sprawdzić liczbę, która może być lub nie nil. Dlatego jest to prawie dorozumiane. Nawet jeśli ktoś podejmie przeciwne założenie, natychmiast zrozumie, co się dzieje, gdy spróbuje to wykonać.
Kolejność jest tutaj ważna, ponieważ jeśli discounttak nil, to nie będzie miała zero?metody. Ocena zwarciowa Ruby powinna jednak uniemożliwić jej ocenę discount.zero?, jeśli tak discountjest nil.
Nie działa dla dowolnych obiektów . "".to_i == "foo".to_i == "0".to_i == 0. Twoja metoda spowoduje wszelkiego rodzaju niezamierzone koercje typu. Nie powiedzie się również, NoMethodErrorjeśli discountnie zareaguje to_i.
Tom Lord,
2
def is_nil_and_zero(data)
data.blank?|| data ==0end
Jeśli miniemy „”, zwróci wartość false, a puste? zwraca true. To samo dzieje się, gdy data = false puste? zwraca true dla ciągu zerowego, false, pustego lub łańcucha spacji. Więc lepiej użyć pustego? metoda, aby uniknąć również pustego łańcucha.
Możesz zainicjować zniżkę do 0, o ile Twój kod gwarantuje, że nie spróbujesz jej użyć przed zainicjowaniem. To usunęłoby jeden czek, jak sądzę, nie mogę myśleć o niczym innym.
Uważam, że następujące elementy są wystarczająco dobre dla kodu ruby. Nie sądzę, bym mógł napisać test jednostkowy, który pokazuje jakąkolwiek różnicę między tym a oryginałem.
discount
jest fałszywy?discount.in? [0, nil]
czystszy sposób jest możliwyOdpowiedzi:
źródło
The and and or keywords are banned. It's just not worth it. Always use && and || instead.
. I słusznie, z powodów Davida i Toma.Uważaj na zwykłe zrzeczenia się odpowiedzialności ... wielką moc / odpowiedzialność, łatanie małp prowadzące do ciemnej strony itp.
źródło
ok, po 5 latach minęło ....
Należy zauważyć, że
try
jest zdefiniowany w klejnocie ActiveSupport, więc nie jest dostępny w zwykłym rubinie.źródło
try
metody.try
pokazuje alternatywną opcję (dlatego właśnie została oceniona!), O ile jest to jasne czytelnik, któryActiveSupport
nie jest waniliowym rubinem.źródło
Począwszy od Ruby 2.3.0, możesz łączyć bezpieczny operator nawigacji (
&.
) zNumeric#nonzero?
.&.
zwraca,nil
jeśli instancja byłanil
inonzero?
- jeśli liczba była0
:Lub postfiks:
źródło
"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String
.... Nie można bezpiecznie używać na dowolnych obiektach.nil
.nonzero?
- jeśli liczba była0
” . Konieczność sprawdzenia, czy powstaje całkowicie dowolny obiekt,0
pojawia się niezwykle rzadko w porównaniu z tym, aby sprawdzić liczbę, która może być lub nienil
. Dlatego jest to prawie dorozumiane. Nawet jeśli ktoś podejmie przeciwne założenie, natychmiast zrozumie, co się dzieje, gdy spróbuje to wykonać.źródło
Możesz to zrobić:
Kolejność jest tutaj ważna, ponieważ jeśli
discount
taknil
, to nie będzie miałazero?
metody. Ocena zwarciowa Ruby powinna jednak uniemożliwić jej ocenędiscount.zero?
, jeśli takdiscount
jestnil
.źródło
Możesz przekonwertować pusty wiersz na wartość całkowitą i sprawdzić zero ?.
źródło
aktualizacja, to będzie
false
dladiscount = false
źródło
Możesz skorzystać z
NilClass
podanej#to_i
metody, która zwróci zero dlanil
wartości:Jeśli
discount
mogą być liczbami ułamkowymi, możesz#to_f
zamiast tego użyć , aby zapobiec zaokrągleniu liczby do zera.źródło
"".to_i == "foo".to_i == "0".to_i == 0
. Twoja metoda spowoduje wszelkiego rodzaju niezamierzone koercje typu. Nie powiedzie się również,NoMethodError
jeślidiscount
nie zareagujeto_i
.Jeśli miniemy „”, zwróci wartość false, a puste? zwraca true. To samo dzieje się, gdy data = false puste? zwraca true dla ciągu zerowego, false, pustego lub łańcucha spacji. Więc lepiej użyć pustego? metoda, aby uniknąć również pustego łańcucha.
źródło
blank?
jest metodą specyficzną dla szyn i nie jest dostępna w rubinach waniliowych.Podczas pracy z rekordem bazy danych lubię inicjować wszystkie puste wartości za pomocą 0, korzystając z pomocnika migracji:
źródło
Możesz zainicjować zniżkę do 0, o ile Twój kod gwarantuje, że nie spróbujesz jej użyć przed zainicjowaniem. To usunęłoby jeden czek, jak sądzę, nie mogę myśleć o niczym innym.
źródło
źródło
Wolę stosować bardziej czyste podejście:
val.to_i
zwróci a0
jeśli val jest anil
,potem wszystko, co musimy zrobić, to sprawdzić, czy ostateczna wartość to zero .
źródło
Alternatywnym rozwiązaniem jest użycie udoskonaleń, takich jak:
źródło
Uważam, że następujące elementy są wystarczająco dobre dla kodu ruby. Nie sądzę, bym mógł napisać test jednostkowy, który pokazuje jakąkolwiek różnicę między tym a oryginałem.
źródło
true
czy rabat byłbynil
.