respond_to? E os parametros?

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?

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

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.

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?

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

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?

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.

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…

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é.