রুবিতে কী পাঠায় ()?


উত্তর:


111

send কোনও পদ্ধতির প্রতিক্রিয়া না হওয়া অবধি অবধি উদাহরণ এবং শ্রেণি শ্রেণিবিন্যাসের পূর্বপুরুষগুলিতে একটি বার্তা প্রেরণ করে (কারণ এটির নামটি প্রথম যুক্তির সাথে মেলে)।

ব্যবহারিকভাবে বলতে গেলে, এই লাইনগুলি সমতুল্য:

1.send '+', 2
1.+(2)
1 + 2

নোট করুন যে sendদৃশ্যমানতা পরীক্ষাগুলি বাইপাস করে, যাতে আপনি ব্যক্তিগত পদ্ধতিগুলিকেও কল করতে পারেন (ইউনিট পরীক্ষার জন্য দরকারী)।


প্রেরণের আগে যদি সত্যিই কোনও পরিবর্তনশীল না থাকে, তার অর্থ বিশ্বব্যাপী অবজেক্টটি ব্যবহৃত হয়েছে:

send :to_s    # "main"
send :class   # Object

4
ওহ আমি দেখতে পাচ্ছি, সুতরাং কেউ যদি প্রাত্যহিকভাবে দিনের সংখ্যা বলার পরিবর্তে ডেটাবেজে 1.month এর মতো কিছু সঞ্চয় করতে চায় তবে প্রেরণটি ব্যবহার করতে পারে।
খ্রিস্টান ব্যাঙ্কেস্টার

4
সত্য, আপনি স্থির নয় এমন গণনা করা নামগুলির সাথে কল করতে পদ্ধতিটি ব্যবহার করতে পারেন। (আপনি অবাধ ব্যবহারকারীর ইনপুট, যদিও, বেসরকারী পদ্ধতি কলিং এড়ানোর অনুমতি থাকবে না ... আপনি পারা অবশ্য তাদের একটি অনন্য প্রিফিক্স করা উচিত: পাঠান 'user_method: _ + methodname, * args)
giraff

4
আপনি যদি কোনও সুরক্ষিত শ্রেণি পদ্ধতি পরীক্ষা করতে চান তবে ভাল ব্যবহারের ক্ষেত্রে, আপনি এটিকে ক্লাসের বাইরেও বলতে পারেন test পরীক্ষার ফাইলে ..
জিএন।

108

প্রেরণ হ'ল একটি রুবি (রেলহীন) পদ্ধতি যা নাম অনুসারে অন্য পদ্ধতি চালিত করতে দেয়।

ডকুমেন্টেশন থেকে

   class Klass
     def hello(*args)
       "Hello " + args.join(' ')
     end
   end
   k = Klass.new
   k.send :hello, "gentle", "readers"   #=> "Hello gentle readers"

http://corelib.rubyonrails.org/classes/Object.html#M001077


5
ভার্চুজের গৃহীত উত্তরের চেয়ে দুর্দান্ত উত্তর clear
অ্যারন-কোডিং

65

আমি পাঠান পদ্ধতির সাহায্যে সর্বাধিক দরকারী বৈশিষ্ট্যটি হ'ল এটি কার্যকরভাবে পদ্ধতিতে কল করতে পারে। এটি আপনাকে অনেক টাইপ করে সংরক্ষণ করতে পারে। .সেন্ড পদ্ধতির সর্বাধিক জনপ্রিয় ব্যবহারগুলির মধ্যে একটি হ'ল গতিশীল বৈশিষ্ট্যগুলি নির্ধারণ করা। উদাহরণ স্বরূপ:

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

দুর্দান্ত লিঙ্কটির জন্য ধন্যবাদ
sid_09

7
এই পদ্ধতিতে .সেন্ডটি ব্যবহার করা অপ্রয়োজনীয় জটিলতা যুক্ত করে এবং অজান্তেই কোডটিতে একটি বাগ প্রবর্তন করা সহজ করে তোলে। উদাহরণস্বরূপ, উপরের আপনার কোডে, আপনি যদি নিজের প্যারামিটার হ্যাশগুলিতে একটি নতুন এন্ট্রি যুক্ত করেন (যেমন 'সিলিন্ডার'), কোড একটি অপরিজ্ঞাত পদ্ধতি ত্রুটির সাথে ব্যর্থ হবে।
কেভিন শোয়ারডটফিগার

4
সাড়া? যদি ইচ্ছা হয় তবে এ জাতীয় ত্রুটিগুলি রোধ করতে ব্যবহার করা যেতে পারে।
রিচার্ড_জি

4
এটি ছিল দুর্দান্ত ব্যাখ্যা! ধন্যবাদ ঝা!
শারথ

4
@ কেভিন আপনি ঠিক বলেছেন তবে মাঝে মাঝে এটি প্রয়োজনও হতে পারে। আরও নমনীয়তা আরও ঝুঁকির সাথে সম্পর্কিত, যা হ্রাস করা যায়।
উইল শেপার্ড

13

অ্যান্টোনিও ঝা এর 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

সহজ এবং সহজ ব্যাখ্যার জন্য ধন্যবাদ!
জুনন চাকমা

ধন্যবাদ! ঠিক এই উত্তর আমি পরে করছি। আশ্চর্য কি এটি সাধারণত ব্যবহৃত হয়? আমি লিগ্যাসি কোডে অনুরূপ কিছু পেয়েছি, এটির সাথে আমার লেগে থাকা উচিত তা নিশ্চিত নয় @ @ মাইক ভাল্লানো
বি লিউ

4
@ বি-লিউ আমি এটি নতুন কোডে অভিজ্ঞ বিকাশকারীদের দ্বারা ব্যবহার করে দেখেছি। এটি ব্যবহার করার সময়ও সহায়ক হতে পারে define_method: apidock.com/ruby/Module/define_method
মাইক ভাল্লানো

অসাধারণ! ধন্যবাদ গাদা! @ মাইকভ্যালানো
বি লিউ

4

কী পাঠায়?

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। রুবি রূপান্তরকাজ করার সময় এটি খুব সহজ হতে পারে, কারণ এটি আমাদের বিভিন্ন প্রয়োজন অনুসারে বিভিন্ন পদ্ধতি কল করতে দেয়।


0

দেখার জন্য আরও একটি ব্যবহারের কেস:

    <%= link_to 
    send("first_part_of_path_#{some_dynamic_parameters}_end_path", 
    attr1, attr2), ....
    %>

অনুমতি দিন আপনাকে স্কেলযোগ্য দর্শন লিখতে হবে যারা এগুলির সাথে সমস্ত ধরণের অবজেক্টের সাথে কাজ করে:

    render 'your_view_path', object: "my_object"

এটি দর্শনগুলিতে অপ্রয়োজনীয় যুক্তি যুক্ত করে এবং এতে সুরক্ষা জড়িত থাকতে পারে। এটি করবেন না। অ্যারে এবং হ্যাশ ব্যবহার করুন।
ডেরেক বার্ট্র্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.