5 ответов:
sendотправляет сообщение экземпляру объекта и его предкам в иерархии классов до тех пор, пока какой-либо метод не отреагирует (поскольку его имя соответствует первому аргументу).практически говоря, эти линии эквивалентны:
1.send '+', 2 1.+(2) 1 + 2отметим, что
sendобходит проверки видимости, так что вы можете вызвать частные методы, тоже (полезно для модульного тестирования).
если действительно нет переменной перед отправкой, это означает, что глобальный объект используется:
send :to_s # "main" send :class # Object
отправить - Это метод ruby (без rails), позволяющий вызывать другой метод по имени.
из документации
class Klass def hello(*args) "Hello " + args.join(' ') end end k = Klass.new k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
одна из самых полезных функций я думаю .отправка метод заключается в том, что он может динамически вызвать метод. Это может сэкономить вам много печатать. Одно из самых популярных применений .отправка способ, чтобы динамически назначать атрибуты. Например:
class Car attr_accessor :make, :model, :year endчтобы регулярно назначать атрибуты, нужно было бы
c = Car.new c.make="Honda" c.model="CRV" c.year="2014"или с помощью .отправка метод:
c.send("make=", "Honda") c.send("model=", "CRV") c.send("year=","2014")но все это можно заменить следующим:
предполагая, что ваше приложение Rails должно назначить атрибуты для вашего класса автомобиля из пользовательского ввода, вы можете сделать
c = Car.new() params.each do |key, value| c.send("#{key}=", value) end
другой пример, похожий на Антонио Джа https://stackoverflow.com/a/26193804/1897857
Если вам нужно прочитать атрибуты на объекте.
например, если у вас есть массив строк, Если вы попытаетесь перебрать их и вызвать их на свой объект, это не сработает.
вы можетеatts = ['name', 'description'] @project = Project.first atts.each do |a| puts @project.a end # => NoMethodError: undefined method `a'sendстроки к объекту:atts = ['name', 'description'] @project = Project.first atts.each do |a| puts @project.send(a) end # => Vandalay Project # => A very important project
другой вариант использования на вид:
<%= link_to send("first_part_of_path_{some_dynamic_parameters}_end_path", attr1, attr2), .... %>разрешить . вы пишете масштабируемое представление, которое работает со всеми видами объектов с:
render 'your_view_path', object: "my_object"
Comments