কেউ কি আমাকে বলতে পারেন দয়া করে
send("#{Model.find...}")
হয় এবং না?
কেউ কি আমাকে বলতে পারেন দয়া করে
send("#{Model.find...}")
হয় এবং না?
উত্তর:
send কোনও পদ্ধতির প্রতিক্রিয়া না হওয়া অবধি অবধি উদাহরণ এবং শ্রেণি শ্রেণিবিন্যাসের পূর্বপুরুষগুলিতে একটি বার্তা প্রেরণ করে (কারণ এটির নামটি প্রথম যুক্তির সাথে মেলে)।
ব্যবহারিকভাবে বলতে গেলে, এই লাইনগুলি সমতুল্য:
1.send '+', 2
1.+(2)
1 + 2
নোট করুন যে sendদৃশ্যমানতা পরীক্ষাগুলি বাইপাস করে, যাতে আপনি ব্যক্তিগত পদ্ধতিগুলিকেও কল করতে পারেন (ইউনিট পরীক্ষার জন্য দরকারী)।
প্রেরণের আগে যদি সত্যিই কোনও পরিবর্তনশীল না থাকে, তার অর্থ বিশ্বব্যাপী অবজেক্টটি ব্যবহৃত হয়েছে:
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")
তবে এগুলি সমস্ত নিম্নলিখিত দ্বারা প্রতিস্থাপন করা যেতে পারে:
আপনার রেলস অ্যাপ্লিকেশনটিকে আপনার গাড়ী শ্রেণিতে বৈশিষ্ট্যগুলি ব্যবহারকারী ইনপুট থেকে বরাদ্দ করা দরকার বলে ধরে নিচ্ছেন, আপনি এটি করতে পারেন
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
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। রুবি রূপান্তরকাজ করার সময় এটি খুব সহজ হতে পারে, কারণ এটি আমাদের বিভিন্ন প্রয়োজন অনুসারে বিভিন্ন পদ্ধতি কল করতে দেয়।
দেখার জন্য আরও একটি ব্যবহারের কেস:
<%= link_to
send("first_part_of_path_#{some_dynamic_parameters}_end_path",
attr1, attr2), ....
%>
অনুমতি দিন আপনাকে স্কেলযোগ্য দর্শন লিখতে হবে যারা এগুলির সাথে সমস্ত ধরণের অবজেক্টের সাথে কাজ করে:
render 'your_view_path', object: "my_object"