W Rubim mogę zdefiniować metodę foo = (bar):
irb(main):001:0> def foo=(bar)
irb(main):002:1> p "foo=#{bar}"
irb(main):003:1> end
=> nil
Teraz chciałbym sprawdzić, czy został zdefiniowany,
irb(main):004:0> defined?(foo=)
SyntaxError: compile error
(irb):4: syntax error, unexpected ')'
from (irb):4
from :0
Jaka jest właściwa składnia do użycia w tym miejscu? Zakładam, że musi istnieć sposób na uniknięcie „foo =”, tak aby zostało przetworzone i przekazane poprawnie do zdefiniowanego? operator.
ruby
syntax-error
Alex Boisvert
źródło
źródło
foo=
jest on zawsze używany w zadaniach, więc Ruby zwróci,"assignment"
jeśli przetestujeszdefined? foo()
(zobacz zaktualizowaną odpowiedź).Możesz sprawdzić, czy metoda istnieje, używając
respond_to?
metody i przekazać jej symbol, np.bar.respond_to?(:foo=)
Aby zobaczyć, czy obiektbar
ma metodęfoo=
. Jeśli chcesz wiedzieć, czy instancje klasy odpowiadają na metodę, której możesz użyćmethod_defined?
na klasie (lub module), npFoo.method_defined?(:bar=)
.defined?
nie jest metodą, ale operatorem, który zwraca opis operandu (lub nil, jeśli nie jest zdefiniowany, dlatego można go użyć w instrukcji if). Operandem może być dowolne wyrażenie, tj. Stała, zmienna, przypisanie, metoda, wywołanie metody itp. Powodem, dla którego to nie działa, kiedy to robisz,defined?(foo=)
są nawiasy, pomiń je i powinno działać bardziej lub mniej zgodnie z oczekiwaniami. To powiedziawszy,defined?
jest dość dziwnym operatorem i nikt nie używa go do testowania istnienia metod.źródło
respond_to?
,start_with?
,end_with?
.you.knock if you.respond_to?(:knock)