বর্তমানে সম্পাদনকারী পদ্ধতির নাম পান


198

$0 শীর্ষ স্তরের রুবি প্রোগ্রামের জন্য পরিবর্তনশীল, তবে বর্তমান পদ্ধতির জন্য এখানে কি একটি রয়েছে?


একটি ব্যবহার হচ্ছে যাচাই superকরা একটি সরলডেলিগেটর অবজেক্টের মধ্যে কল করা যেতে পারে:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
ক্রিস

উত্তর:


334

আমার প্রথম উত্তরের চেয়েও ভাল আপনি____ আদর্শ__ ব্যবহার করতে পারেন:

class Foo
  def test_method
    __method__
  end
end

এটি প্রতীক প্রদান করে - উদাহরণস্বরূপ :test_method,। স্ট্রিং হিসাবে পদ্ধতির নামটি ফিরতে, __method__.to_sপরিবর্তে কল করুন।

দ্রষ্টব্য: এর জন্য রুবি দরকার 1.8.7।


11
':' কেবল প্রতীক চিহ্ন is :) শুধু করুন __method__.to_sএবং এটি পদ্ধতির নাম
হ'ল

আমি যদি রেকের কাজে থাকি তবে কী হবে?
ইমরান আহমদ

24

Http://snippets.dzone.com/posts/show/2785 থেকে :

module Kernel
private
    def this_method_name
      caller[0] =~ /`([^']*)'/ and $1
    end
end

class Foo
  def test_method
    this_method_name
  end
end

puts Foo.new.test_method    # => test_method

5
কলিংয়ের নামটি (বর্তমানের বিপরীতে) পদ্ধতির সন্ধানের জন্য এটি আমার পক্ষে খুব সহায়ক হয়েছিল ।
ল্যাম্বার্ট

এটা কি করে __callee__না?
জোশুয়া পিন্টার 22'15

দুর্দান্ত সমাধান চিহ্নিত করুন এখনই সেরা সমাধান। দুর্দান্ত কাজ
jonathanccalixto

18

আপনি আসলে চান তার উপর ভিত্তি করে, আপনি ব্যবহার করতে পারেন __method__বা __callee__, যা একটি প্রতীক হিসেবে বর্তমানে নির্বাহ পদ্ধতি নাম ফিরে যান।

রুবি ১.৯-এ, উভয়ই একইরকম আচরণ করে (যতদূর ডক্স এবং আমার পরীক্ষার বিষয় হিসাবে বিবেচিত )।

রুবিতে 2.1 এবং 2.2 এ __callee__আপনি আলাদাভাবে আচরণ করে যদি আপনি সংজ্ঞায়িত পদ্ধতির কোনও উপাধি কল করেন। ডক্স দুই জন্য বিভিন্ন আছেন:

  • __method__: "বর্তমান পদ্ধতির সংজ্ঞা অনুসারে নাম" (যেমন নামটি এটি সংজ্ঞায়িত করা হয়েছিল)
  • __callee__: "বর্তমান পদ্ধতির পরিচিত নাম" (যেমন এটি নাম হিসাবে পরিচিত (আহবান করা হয়েছে))

পরীক্ষার স্ক্রিপ্ট:

require 'pp'
puts RUBY_VERSION
class Foo
  def orig
    {callee: __callee__, method: __method__}
  end
  alias_method :myalias, :orig
end
pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} )

1.9.3 আউটপুট:

1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:orig, :method=>:orig}}

২.১.২ আউটপুট (পৃথক __callee__নামটি প্রদান করে, তবে __method__পদ্ধতিটি সংজ্ঞায়িত অবস্থায় নামটি দেয়):

2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
 :call_alias=>{:callee=>:myalias, :method=>:orig}}

10

রুবি ১.৯+ এর জন্য আমি ব্যবহার করার পরামর্শ দিই __callee__


3
__callee__1.9 এর আগে আলাদা আচরণ করে, সুতরাং এটির সাথে __method__সঙ্গতিপূর্ণ আচরণ করা ভাল কারণ এটির ধারাবাহিক আচরণ রয়েছে। ১.৯-এর পরে __callee__একই আচরণ করে __method__
লেঃ ম্যাককুলাচ

@ লেইগম্যাকক্লোচ আপনি একটি উদাহরণ দিয়ে পার্থক্যটি ব্যাখ্যা করতে পারবেন (সম্ভবত কোনও নতুন উত্তরে)?
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

@ সিরোস্যান্টিলি @ 事件 法轮功 法轮功 纳米比亚 威 you def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2আপনি কি অদ্ভুত কিছু দেখছেন না?
jgburet

4
@ লিগম্যাকক্লোচ আসলে এখনই __callee__এবং __method__এর আলাদা আচরণ রয়েছে। দেখুন pastie.org/10380985 (রুবি 2.1.5)
goodniceweb

1
pastie.org ডাউন আছে। চিরদিন নাকি এখনই?
নাকিলন

-3

ভিউ ফাইলটিতে পদ্ধতির নাম পুনরুদ্ধার করতে আমি একই সমস্যা পেয়েছি। আমি সমাধান পেয়েছিলাম

params[:action] # it will return method's name

আপনি যদি নিয়ামকের নামটি পেতে চান তবে

params[:controller] # it will return you controller's name

4
আমি মনে করি আপনি রেলের নিয়ন্ত্রণকারী ক্রিয়া ও HTTP পদ্ধতি সম্পর্কে প্রশ্নটির ভুল ব্যাখ্যা করেছেন ... এই উত্তরটি সম্ভবত মুছে ফেলা উচিত।
ফ্যাক্টর মিস্টিক

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