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


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.