respond_to? E os parametros?

8 respostas
N

O método respond_to? checa se o método existe, mas e os parametros?

Tem como eu perguntar se um objeto tem um método foo que recebe um parametro?

8 Respostas

Mauricio_Linhares

Não existe sobrecarga de métodos em Ruby, então não faz muito sentido o que você quer.

N

Faz sim. Acho que o jeito é pegar o objeto Method e checar o Unarity dele…

Quero evitar fazer uma chamada via reflection e ganhar uma exception por causa do número de parametros errados.

saoj

Eu faço assim:

if obj.class.public_method_defined?(name) then
  m = obj.method(name)
  return m.call if m.arity <= 0
end

Tá certo?

cv1

Nao, pq o cara pode estar implementando method_missing e vc vai negar a chamada, mesmo quando ela eh suportada.

saoj

Verdade. Por isso que é boa prática sempre que o cara implementar method_missing ele implementar tb respond_to?, certo?

A questão é simples então: se o cara tá implementando method_missing, como saber o número de parametros de um método implementado ali???

Só quero chamar XXXX se XXXX não tiver parametros… Via method_missing não tem como, tem?

pcalcado

Esse é o velho problema de pensar em funções e não em mensagens. Quando vcoê invoca um método em Ruby está passando ma mensagem para um objeto e o objeto aceita aquela mensagem de acordo com que ele achar melhor, seja definindo explicitamente na classe ou com qualquer um dos milhare de métodos. Eu acredito que posam have motivos legítimos para ter esta preocupação mas na maioria das vzes que eu vi ste tipo de ‘problema’ se manifestar era porque alguém estava rogramando em Java com sintaxe de Ruby.

saoj
class Test

  def hello(a)
    puts "Saying hello: #{a}"
  end
end

t = Test.new

t.send(:hello) if t.respond_to?(:hello)
C:\java\ruby>ruby test.rb
test.rb:12:in `hello': wrong number of arguments (0 for 1) (ArgumentError)
        from test.rb:12:in `send'
        from test.rb:12

Saber quantos parâmetros um método ou uma mensagem necessita não é crime…

Mauricio_Linhares

Não, crime é você sair fazendo chamadas a reflexão e não querer padronização. Se você está fazendo chamadas usando reflexão é porque um contrato mínimo foi definido (como por exemplo “toda action é cheia de métodos públicos sem parâmetros”), se você não tem nem isso aí virou cabaré.

Criado 15 de março de 2008
Ultima resposta 18 de mar. de 2008
Respostas 8
Participantes 5