Lütfen birisi bana ne söyleyebilir mi
send("#{Model.find...}")
ve yapar mı?
Lütfen birisi bana ne söyleyebilir mi
send("#{Model.find...}")
ve yapar mı?
Yanıtlar:
send bir yöntem tepki verene kadar bir nesne örneğine ve onun üst öğelerine sınıf hiyerarşisindeki bir mesaj gönderir (çünkü adı ilk argümanla eşleşir).
Pratik olarak bu satırlar eşdeğerdir:
1.send '+', 2
1.+(2)
1 + 2
sendÖzel yöntemleri de çağırabilmeniz için görünürlük kontrollerini atladığını unutmayın (birim testi için kullanışlıdır).
Göndermeden önce gerçekten değişken yoksa, bu, global Object'in kullanıldığı anlamına gelir:
send :to_s # "main"
send :class # Object
send , isme göre başka bir yöntemi çağırmaya izin veren bir ruby (raysız) yöntemidir.
Belgelerden
class Klass
def hello(*args)
"Hello " + args.join(' ')
end
end
k = Klass.new
k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
.Send yöntemi ile düşündüğüm en kullanışlı özelliklerden biri, yöntemi dinamik olarak çağırabilmesidir. Bu size çok fazla yazı yazmadan tasarruf sağlayabilir. .Send yönteminin en popüler kullanımlarından biri, öznitelikleri dinamik olarak atamaktır. Örneğin:
class Car
attr_accessor :make, :model, :year
end
Nitelikleri düzenli olarak atamak için birinin
c = Car.new
c.make="Honda"
c.model="CRV"
c.year="2014"
Veya .send yöntemini kullanarak:
c.send("make=", "Honda")
c.send("model=", "CRV")
c.send("year=","2014")
Ancak tümü aşağıdakilerle değiştirilebilir:
Rails uygulamanızın, kullanıcı girdisinden araç sınıfınıza özellikler ataması gerektiğini varsayarsak,
c = Car.new()
params.each do |key, value|
c.send("#{key}=", value)
end
Antonio Jha'nın https://stackoverflow.com/a/26193804/1897857'ye benzer başka bir örnek
bir nesnedeki nitelikleri okumanız gerekmesidir.
Örneğin, bir dizi dizginiz varsa, bunları yinelemeye ve onları nesnenizde çağırmaya çalışırsanız, işe yaramaz.
atts = ['name', 'description']
@project = Project.first
atts.each do |a|
puts @project.a
end
# => NoMethodError: undefined method `a'
Ancak, sendnesneye dizeleri yapabilirsiniz :
atts = ['name', 'description']
@project = Project.first
atts.each do |a|
puts @project.send(a)
end
# => Vandalay Project
# => A very important project
define_method: apidock.com/ruby/Module/define_method .
send bir yöntemi çağırmanın başka bir yoludur.
Bu, en iyi örnekle açıklanır:
o = Object.new
o.send(:to_s) # => "#<Object:0x00005614d7a24fa3>"
# is equivalent to:
o.to_s # => "#<Object:0x00005614d7a24fa3>"
Object sınıfında can gönderin .
Bu yaklaşımın yararı, çağırmak istediğiniz yöntemi parametre olarak geçirebilmenizdir. İşte basit bir örnek:
def dynamically_call_a_method(name)
o = Object.new
o.send name
end
dynamically_call_a_method(:to_s) # => "#<Object:0x00005614d7a24fa3>"
Çağrılmasını istediğiniz yöntemi geçebilirsiniz. Bu durumda biz geçtik :to_s. Ruby metaprogramlama yaparken bu çok kullanışlı olabilir, çünkü bu bizim farklı gereksinimlerimize göre farklı yöntemler çağırmamıza izin verir.
Görünümler için başka bir kullanım örneği:
<%= link_to
send("first_part_of_path_#{some_dynamic_parameters}_end_path",
attr1, attr2), ....
%>
İzin vermek . her tür nesneyle çalışan ölçeklenebilir görünüm yazmanız için:
render 'your_view_path', object: "my_object"