Sumário
- O que é
call()
em Ruby? - O que é
send()
em Ruby? - Aplicações Práticas de
call()
esend()
- Conclusão
- FAQ
O que é call()
em Ruby?
O método call()
, também conhecido como “método de chamada” ou “método chamável”, permite que você invoque um método em um objeto usando o operador de chamada de método ()
. Isso transforma objetos em entidades chamáveis, semelhantes a funções ou procedimentos. Qualquer classe pode definir um método call()
, tornando suas instâncias chamáveis.
class Adder
def initialize(x)
@x = x
end
def call(y)
@x + y
end
end
adder = Adder.new(5)
result = adder.call(3) # result será 8
result = adder.(3) # Equivalente usando o operador de chamada de método
puts result # Saída: 8
call()
é inestimável para criar funções personalizadas ou blocos de código que podem ser passados e executados posteriormente. É uma pedra angular das capacidades de programação funcional do Ruby.
O que é send()
em Ruby?
O método send()
invoca dinamicamente um método em um objeto, aceitando o nome do método como uma string ou símbolo. Isso permite a manipulação em tempo de execução de objetos e seus métodos.
class Greeter
def hello(name)
"Olá, #{name}!"
end
def goodbye(name)
"Adeus, #{name}!"
end
end
greeter = Greeter.new
message = greeter.send(:hello, "Mundo") # message será "Olá, Mundo!"
puts message
message = greeter.send("goodbye", "Mundo") # message será "Adeus, Mundo!"
puts message
O nome do método (`:hello` ou `”goodbye”`) é passado como um argumento para send()
, fornecendo invocação flexível de métodos, mesmo com base em condições dinâmicas. No entanto, é crucial ter cuidado ao usar send()
com entrada não confiável para evitar vulnerabilidades de segurança.
Aplicações Práticas de call()
e send()
call()
e send()
oferecem vantagens distintas:
call()
: Ideal para criar objetos chamáveis, implementar estratégias (por exemplo, diferentes algoritmos de classificação) e trabalhar com conceitos de programação funcional como lambdas e procs. Fornece uma sintaxe mais limpa e legível do quesend()
para métodos predefinidos.send()
: Útil para metaprogramação, despacho dinâmico de métodos com base em condições de tempo de execução e construção de APIs flexíveis. É particularmente útil quando o nome do método é desconhecido em tempo de compilação. No entanto, o uso excessivo pode reduzir a legibilidade e a manutenção do código.
Exemplo: Padrão de Estratégia com call()
class SortStrategy
def call(array)
raise NotImplementedError, "Subclasses devem implementar o método call"
end
end
class BubbleSort < SortStrategy
def call(array)
# Implementação do bubble sort... (Implementação omitida para brevidade)
end
end
class QuickSort < SortStrategy
def call(array)
# Implementação do quick sort... (Implementação omitida para brevidade)
end
end
sorter = BubbleSort.new
sorted_array = sorter.call([3, 1, 4, 1, 5, 9, 2, 6])
Isso demonstra como call()
implementa elegantemente o padrão de estratégia.
Conclusão
call()
e send()
são ferramentas poderosas do Ruby. call()
oferece uma abordagem funcional e limpa para criar objetos chamáveis, enquanto send()
fornece invocação dinâmica de métodos. A compreensão de seus pontos fortes e fracos permite que os desenvolvedores selecionem o método apropriado para cada tarefa, melhorando a flexibilidade e a manutenção do código. Use send()
com cautela, especialmente com entrada não confiável, para mitigar riscos de segurança.
FAQ
- P: Quais são as implicações de segurança do uso de
send()
?
R: Usarsend()
com entrada não confiável pode permitir a execução maliciosa de métodos arbitrários, criando vulnerabilidades. Sempre limpe e valide a entrada antes de usarsend()
. - P: Posso usar
call()
com qualquer método?
R: Não,call()
é especificamente para métodos chamadoscall()
. - P:
send()
é mais rápido do que chamar diretamente um método?
R: Não,send()
envolve uma pesquisa, tornando-o mais lento. Use-o apenas quando a invocação dinâmica for necessária. - P: Qual a diferença entre
send
epublic_send
?
R:public_send
apenas chama métodos públicos, melhorando a segurança, evitando o acesso a métodos privados/protegidos.send
pode chamar métodos de qualquer visibilidade.