วิธีการส่งทับทิมผ่านพารามิเตอร์หลายตัว


129

พยายามสร้างวัตถุและเรียกวิธีการแบบไดนามิกโดย

Object.const_get(class_name).new.send(method_name,parameters_array)

ซึ่งทำงานได้ดีเมื่อ

Object.const_get(RandomClass).new.send(i_take_arguments,[10.0])

แต่โยนอาร์กิวเมนต์ผิดจำนวน 1 สำหรับ 2 สำหรับ

Object.const_get(RandomClass).new.send(i_take_multiple_arguments,[25.0,26.0])

คลาสสุ่มที่กำหนดไว้คือ

class RandomClass
def i_am_method_one
    puts "I am method 1"
end
def i_take_arguments(a)
    puts "the argument passed is #{a}"
end
def i_take_multiple_arguments(b,c)
    puts "the arguments passed are #{b} and #{c}"
end
    end

ใครช่วยฉันเกี่ยวกับวิธีการส่งพารามิเตอร์หลายตัวไปยังวิธีการทับทิมแบบไดนามิก

คำตอบ:


232
send("i_take_multiple_arguments", *[25.0,26.0]) #Where star is the "splat" operator

หรือ

send(:i_take_multiple_arguments, 25.0, 26.0)

22
อาจเป็นที่น่าสังเกตว่า*ในบริบทนี้คือโอเปอเรเตอร์ "splat"
Andrew Marshall

8

คุณสามารถเรียกสลับกันsendโดยใช้คำพ้องความหมาย__send__:

r = RandomClass.new
r.__send__(:i_take_multiple_arguments, 'a_param', 'b_param')

โดยวิธีการ * คุณสามารถส่งผ่านแฮชโดยคั่นด้วยเครื่องหมายจุลภาคดังนี้:

imaginary_object.__send__(:find, :city => "city100")

หรือไวยากรณ์แฮชใหม่:

imaginary_object.__send__(:find, city: "city100", loc: [-76, 39])

ตามที่ Black __send__ปลอดภัยกว่าสำหรับเนมสเปซ

“ การส่งเป็นแนวคิดกว้าง ๆ : ส่งอีเมลข้อมูลจะถูกส่งไปยังซ็อกเก็ต I / O และอื่น ๆ ไม่ใช่เรื่องแปลกที่โปรแกรมจะกำหนดวิธีการที่เรียกว่า send ซึ่งขัดแย้งกับวิธีการส่งในตัวของ Ruby __send__ดังนั้นทับทิมช่วยให้คุณมีทางเลือกในการส่งโทร: ตามแบบแผนไม่มีใครเคยเขียนเมธอดด้วยชื่อนั้นดังนั้นเวอร์ชัน Ruby ในตัวจึงพร้อมใช้งานเสมอและไม่ขัดแย้งกับวิธีการเขียนใหม่ มันดูแปลก แต่ปลอดภัยกว่ารุ่นส่งธรรมดาจากมุมมองของการปะทะกันของชื่อวิธี”

สีดำยังแสดงให้เห็นสายตัดไปใน__send__if respond_to?(method_name)

if r.respond_to?(method_name)
    puts r.__send__(method_name)
else
    puts "#{r.to_s} doesn't respond to #{method_name}"
end

Ref: Black, David A. นักทับทิมที่มีเหตุผล แมนนิ่ง, 2552. หน้า 171.

* ฉันมาที่นี่เพื่อค้นหารูปแบบการแฮช__send__ดังนั้นอาจเป็นประโยชน์สำหรับ Googler คนอื่น ๆ ;)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.