ใครช่วยบอกฉันที
send("#{Model.find...}")
คืออะไร?
ใครช่วยบอกฉันที
send("#{Model.find...}")
คืออะไร?
คำตอบ:
send
ส่งข้อความไปยังอินสแตนซ์อ็อบเจ็กต์และบรรพบุรุษของมันในลำดับชั้นของคลาสจนกว่าเมธอดบางอย่างจะตอบสนอง (เนื่องจากชื่อตรงกับอาร์กิวเมนต์แรก)
ในทางปฏิบัติบรรทัดเหล่านี้เทียบเท่า:
1.send '+', 2
1.+(2)
1 + 2
โปรดทราบว่าsend
ข้ามการตรวจสอบการมองเห็นเพื่อให้คุณสามารถเรียกใช้เมธอดส่วนตัวได้เช่นกัน (มีประโยชน์สำหรับการทดสอบหน่วย)
หากไม่มีตัวแปรก่อนส่งนั่นหมายความว่า global Object ถูกใช้:
send :to_s # "main"
send :class # Object
ส่งเป็นวิธีการทับทิม (ไม่มีราง) ที่อนุญาตให้เรียกใช้วิธีอื่นโดยใช้ชื่อ
จากเอกสารประกอบ
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ของ Antonio Jha
คือถ้าคุณต้องการอ่านแอตทริบิวต์บนวัตถุ
ตัวอย่างเช่นหากคุณมีอาร์เรย์ของสตริงหากคุณพยายามวนซ้ำและเรียกสตริงเหล่านั้นบนอ็อบเจ็กต์ของคุณจะไม่ทำงาน
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
define_method
: apidock.com/ruby/Module/define_method
send
เป็นอีกวิธีหนึ่งในการเรียกเมธอด
ตัวอย่างนี้แสดงได้ดีที่สุด:
o = Object.new
o.send(:to_s) # => "#<Object:0x00005614d7a24fa3>"
# is equivalent to:
o.to_s # => "#<Object:0x00005614d7a24fa3>"
ประโยชน์ของวิธีนี้คือคุณสามารถส่งผ่านเมธอดที่คุณต้องการเรียกเป็นพารามิเตอร์ได้ นี่คือตัวอย่างง่ายๆ:
def dynamically_call_a_method(name)
o = Object.new
o.send name
end
dynamically_call_a_method(:to_s) # => "#<Object:0x00005614d7a24fa3>"
คุณสามารถส่งผ่านวิธีการที่คุณต้องการให้เรียก :to_s
ในกรณีนี้เราผ่านใน สิ่งนี้มีประโยชน์มากในการทำโปรแกรม Ruby เพราะทำให้เราสามารถเรียกวิธีการต่างๆตามข้อกำหนดที่แตกต่างกันของเราได้
กรณีการใช้งานอื่นสำหรับมุมมอง:
<%= link_to
send("first_part_of_path_#{some_dynamic_parameters}_end_path",
attr1, attr2), ....
%>
อนุญาต คุณสามารถเขียนมุมมองที่ปรับขนาดได้ซึ่งทำงานกับวัตถุทุกประเภทด้วย:
render 'your_view_path', object: "my_object"