রুবিতে পদ্ধতির নাম সহ একটি স্ট্রিং থেকে একটি পদ্ধতি কল করা


157

আমি কি তারা বিষয়ে কথা হয় কিভাবে করতে পারি এখানে কিন্তু রুবি মধ্যে?

আপনি কীভাবে কোনও বস্তুর উপর ফাংশনটি করবেন? এবং কীভাবে আপনি বিশ্বব্যাপী কাজ করবেন ( উল্লিখিত পোস্টে জেটসির উত্তর দেখুন )?

উদাহরণ কোড:

event_name = "load"

def load()
  puts "load() function was executed."
end

def row_changed()
  puts "row_changed() function was executed."
end 

#something here to see that event_name = "load" and run load()

আপডেট: আপনি কীভাবে বিশ্বব্যাপী পদ্ধতিতে পাবেন? বা আমার বৈশ্বিক কাজ?

আমি এই অতিরিক্ত লাইন চেষ্টা করেছিলাম

puts methods

এবং লোড এবং সারি পরিবর্তন যেখানে তালিকাভুক্ত নয়।

উত্তর:


232

সরাসরি কোনও বস্তুতে ফাংশন কল করতে

a = [2, 2, 3]
a.send("length")
# or
a.public_send("length")

যা প্রত্যাশিত হিসাবে 3 ফিরে আসে

বা একটি মডিউল ফাংশন জন্য

FileUtils.send('pwd')
# or
FileUtils.public_send(:pwd)

এবং স্থানীয়ভাবে সংজ্ঞায়িত পদ্ধতি

def load()
    puts "load() function was executed."
end

send('load')
# or
public_send('load')

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


3
+1 এটি কাজ করে। এটি একটি বোবা ফলোআপ হতে পারে ... তবে আমি কীভাবে রুবি উত্সে পাঠানো শব্দটি খুঁজে পাচ্ছি না - সি: y রুবি \ লিবিব u রুবি \ 1.8 \ fileutils.rb? ভেবেছিলাম আমি সেখানে প্রেরণ ফাংশনটি খুঁজে পাব।
বুডিজো

1
হুডের নীচে এটি কী করছে তা সম্পর্কে আমি আগ্রহী ছিলাম।
বুডিজো

এটি অবজেক্টে সংজ্ঞায়িত করা হয়েছে - রুবি - ডোক.আর.কোরি / স্লাসস / ওবজেক্ট। Html#M000332 আমি সুদের মূল্যের জন্য একটি এলোমেলো ফাংশন বেছে নিয়েছি
কলিন গ্রাভিল 21

1
আকর্ষণীয় কারণ আমি আপনার উত্তরটি দু'বার পড়ার আগে এবং এটি সম্পূর্ণভাবে গ্রুকড করার আগে আমি ফাইল ইউটিলেস.সেন্ড ("লোড") চালিয়েছিলাম এবং এটি আমার ফাংশনটি চালিয়েছিল। সুতরাং যদি আমি "গ্লোবাল" এ ফাংশন তৈরি করে এটি সঠিকভাবে বুঝতে পারি আমি মূল অবজেক্টের সাথে পদ্ধতিগুলি যুক্ত করছি? অথবা না?
বুডিজো

12
উত্সে জিনিস আপ খুঁজছেন জন্য আপনি ভাল! :)
কলিন গ্রাভিল

34

তিনটি উপায়: send/ call/ eval- এবং তাদের বেঞ্চমার্ক

সাধারণ প্রার্থনা (রেফারেন্সের জন্য):

s= "hi man"
s.length #=> 6

ব্যবহার send

s.send(:length) #=> 6

ব্যবহার call

method_object = s.method(:length) 
p method_object.call #=> 6

ব্যবহার eval

eval "s.length" #=> 6

 

benchmarks

require "benchmark" 
test = "hi man" 
m = test.method(:length) 
n = 100000 
Benchmark.bmbm {|x| 
  x.report("call") { n.times { m.call } } 
  x.report("send") { n.times { test.send(:length) } } 
  x.report("eval") { n.times { eval "test.length" } } 
} 

... যেমন আপনি দেখতে পাচ্ছেন, কোনও পদ্ধতি অবজেক্টটি ইনস্ট্যান্ট করা একটি পদ্ধতি কল করার দ্রুততম গতিশীল উপায়, এওলটি ব্যবহার করা কতটা ধীর গতির তা লক্ষ্য করুন।

#######################################
#####   The results
#######################################
#Rehearsal ----------------------------------------
#call   0.050000   0.020000   0.070000 (  0.077915)
#send   0.080000   0.000000   0.080000 (  0.086071)
#eval   0.360000   0.040000   0.400000 (  0.405647)
#------------------------------- total: 0.550000sec

#          user     system      total        real
#call   0.050000   0.020000   0.070000 (  0.072041)
#send   0.070000   0.000000   0.070000 (  0.077674)
#eval   0.370000   0.020000   0.390000 (  0.399442)

ক্রেডিট এই ব্লগ পোস্টে যায় যা তিনটি পদ্ধতিতে আরও কিছুটা বিশদভাবে জানায় এবং পদ্ধতিগুলি বিদ্যমান কিনা তা পরীক্ষা করে দেখুন।


আমি এটি সন্ধান করছিলাম এবং আমি এমন কিছু লক্ষ্য করলাম যা thatাকা হয়নি। আমি কি করতে চাইলে কি করব Class.send("classVariable") = 5? এটি একটি ত্রুটি ছুড়ে দেয়। যে প্রায় কোনো উপায় আছে কি? একই জিনিসটি ব্যবহারের ক্ষেত্রে সত্যClass.method("classVariable").call() = 5
ক্র্যাকমাস্টার

আপনি যদি এই ক্লাসনাম.সেন্ড ("পদ্ধতি_নাম", আরজি 1, আরজি 2) প্রেরণ কল ব্যবহারের সাথে কিছু যুক্তি প্রেরণ করতে চান
আলেম

আপনার বেঞ্চমার্কের জন্য সঠিক সময়টি সঠিকভাবে উপস্থাপন করার জন্য callপদ্ধতি অবজেক্ট ( m.test.method(:length)) ইনস্ট্যান্ট করা উচিত নয় ? ব্যবহার করার সময় callআপনি সম্ভবত প্রতিবার পদ্ধতি অবজেক্টটি ইনস্ট্যান্ট করতে যাচ্ছেন।
জোশুয়া পিন্টার

ব্লগ পোস্টের লিঙ্কটি মারা গেছে, বিটিডব্লিউ।
জোশুয়া পিন্টার

33

এটা ব্যবহার কর:

> a = "my_string"
> meth = a.method("size")
> meth.call() # call the size method
=> 9

সরল, তাই না?

গ্লোবাল হিসাবে , আমি মনে করি রুবি উপায়টি ব্যবহার করে এটি অনুসন্ধান করা হবে methods


মেথ = এ.মোথড? এই কলটি ইতিমধ্যে ফাংশন না? পদ্ধতি যদি কিছু ফেরত দেয়?
ব্যবহারকারী 1735921

এফওয়াইআই যখন পদ্ধতিটির অস্তিত্ব নেই: "my_string".method('blah') #=> NameError: undefined method ক্লাসের জন্য ' String'
জোশুয়া পিন্টার

3

ব্যক্তিগতভাবে আমি রেফারেন্সগুলি কার্য করতে একটি হ্যাশ সেটআপ করব এবং তারপরে স্ট্রিংটিকে হ্যাশের সূচক হিসাবে ব্যবহার করব। তারপরে আপনি এর পরামিতিগুলির সাথে ফাংশন রেফারেন্সটি কল করুন। আপনি কল করতে চান না এমন কোনও কলকে ভুল স্ট্রিংকে অনুমতি না দেওয়ার সুবিধা রয়েছে। অন্য উপায়টি মূলত evalস্ট্রিং। এটা করো না.

পিএস অলস হবেন না এবং আসলে কোনও কিছু যুক্ত করার পরিবর্তে আপনার পুরো প্রশ্নটি টাইপ করুন।


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