Mam obiekt danych, który zawiera dziesiątki pól attr_accessor dla różnych danych wejściowych. Czy mogę w jakiś sposób zdefiniować klasę tak, aby wszystkie setery dla wszystkich pól były np. ustawić wartość jako pusty ciąg zamiast próby zerowej?attr_accessor, który przekształca zero na ciąg znaków przy pisaniu
Odpowiedz
Oto mały moduł do zrobienia to:
module NilToBlankAttrAccessor
def nil_to_blank_attr_accessor(attr)
attr_reader attr
define_method "#{attr}=" do |value|
value = '' if value.nil?
instance_variable_set "@#{attr}", value
end
end
end
Wystarczy zmieszać go w:
class Foo
extend NilToBlankAttrAccessor
nil_to_blank_attr_accessor :bar
end
i używać go:
foo = Foo.new
foo.bar = nil
p foo.bar # => ""
foo.bar = 'abc'
p foo.bar # => "abc"
Jak to działa
NilToBlankAttrAccessor#nil_to_blank_attr_accessor
pierwszy definiuje attr_reader normalnie:
attr_reader attr
Następnie definiuje pisarz, definiując metodę o tej samej nazwie, co akcesor, tylko z "=" na końcu. Tak więc, dla atrybutu :bar
, metoda nosi nazwę bar=
define_method "#{attr}=" do |value|
...
end
Teraz trzeba ustawić zmienną. Po pierwsze okazuje nil do pustej struny:
value = '' if value.nil?
Następnie użyj instance_variable_set, który robi to przypisanie zmiennej instancji gdzie zmienna instancji nie jest znany aż do czasu wykonywania.
instance_variable_set "@#{attr}", value
klasy Foo potrzebuje nil_to_blank_attr_accessor być metoda klasy, a nie metoda instancji, więc używa extend
zamiast include
:
class Foo
extend NilToBlankAttrAccessor
...
end
To zmieni nie tylko 'zero', ale także' fałsz' na '" ". – sawa
@sawa, dziękuję. Naprawiony. –
@WayneConrad To miła odpowiedź i świetne wyjaśnienie :) –
Zamiast robić
object.foo = given_input
należy zrobić
object.foo = given_input.nil? ? "" : given_input
lub jeśli chcesz włączyć false
do ""
jak dobrze, to
object.foo = given_input || ""
- 1. Dlaczego Propel przekształca właściwość float na ciąg?
- 2. Dlaczego f.label przekształca łańcuch znaków "ALL" na "Wszystkie" cap
- 3. Tworzenie strumienia FILE *, który powoduje ciąg znaków
- 4. Dlaczego Struts2 przekształca mój ciąg na tablicę ciągów?
- 5. C# stwierdzenie ciąg znaków, który jest rozpięta na wielu liniach
- 6. Konwertowanie znaków Unicode na ciąg znaków
- 7. Konwertuj ciąg znaków na datetime
- 8. Konwertuj ciąg znaków na float?
- 9. szyny, błąd składni przy pisaniu skryptu kawowego
- 10. R, podzielony ciąg znaków na pary znaków
- 11. Przekształć tablicę znaków na ciąg znaków
- 12. Konwertuj ciąg znaków RTF na ciąg XAML
- 13. ciąg :: kasowanie (0) na pusty ciąg znaków?
- 14. C# pusty ciąg -> zero?
- 15. Edytowalny tekst na ciąg znaków
- 16. Databinding RichTextBox.Text na ciąg znaków
- 17. Konwertowanie DateTime na ciąg znaków
- 18. Podział ciągu na ciąg znaków
- 19. Konwersja XmlElement na ciąg znaków
- 20. Podziel ciąg znaków na tablicę znaków w C++
- 21. attr_accessor dla tablicy?
- 22. Parsowanie obiektu json na ciąg znaków
- 23. Jak mogę podzielić ciąg znaków na pierwsze wystąpienie czegoś?
- 24. Zwróć ciąg znaków w ciągu znaków na podstawie wyrażenia 'x = {(. *)}'
- 25. Dzielenie ciąg znaków, który musi uciec sekwencji przy użyciu wyrażenia regularnego w Javie
- 26. Konwersja OData na ciąg znaków sql
- 27. Ruby instance_eval na klasie z attr_accessor
- 28. Zapytanie do listy, który ciąg znaków wystąpił w tabeli?
- 29. Konwertowanie zawartości pliku HtmlTextWriter na ciąg znaków
- 30. Konwersja z ciągu szesnastkowego na ciąg znaków
Co masz na myśli "usiłowanie Nil"? – Linuxios
Jeśli ktoś spróbuje object.foo = nil, w rzeczywistości zmienna foo zostanie ustawiona na "" zamiast zera. –