كيف لك قائمة حاليا الكائنات المتوفرة في النطاق الحالي في روبي ؟

StackOverflow https://stackoverflow.com/questions/228648

  •  04-07-2019
  •  | 
  •  

سؤال

أنا جديدة على روبي و انا اللعب حولها مع المجلس.

وجدت أنني يمكن أن قائمة أساليب كائن باستخدام ".أساليب" الأسلوب ، وأن النفس.أساليب نوعا ما تعطيني ما أريد (على غرار بايثون dir(builtins)?), ولكن كيف يمكنني العثور على أساليب مكتبة/وحدة لقد حملت عبر تشمل تتطلب ؟

irb(main):036:0* self.methods
=> ["irb_pop_binding", "inspect", "taguri", "irb_chws", "clone", "irb_pushws", "public_methods", "taguri=", "irb_pwws",
"public", "display", "irb_require", "irb_exit", "instance_variable_defined?", "irb_cb", "equal?", "freeze", "irb_context
", "irb_pop_workspace", "irb_cwb", "irb_jobs", "irb_bindings", "methods", "irb_current_working_workspace", "respond_to?"
, "irb_popb", "irb_cws", "fg", "pushws", "conf", "dup", "cwws", "instance_variables", "source", "cb", "kill", "help", "_
_id__", "method", "eql?", "irb_pwb", "id", "bindings", "send", "singleton_methods", "popb", "irb_kill", "chws", "taint",
 "irb_push_binding", "instance_variable_get", "frozen?", "irb_source", "pwws", "private", "instance_of?", "__send__", "i
rb_workspaces", "to_a", "irb_quit", "to_yaml_style", "irb_popws", "irb_change_workspace", "jobs", "type", "install_alias
_method", "irb_push_workspace", "require_gem", "object_id", "instance_eval", "protected_methods", "irb_print_working_wor
kspace", "irb_load", "require", "==", "cws", "===", "irb_pushb", "instance_variable_set", "irb_current_working_binding",
 "extend", "kind_of?", "context", "gem", "to_yaml_properties", "quit", "popws", "irb", "to_s", "to_yaml", "irb_fg", "cla
ss", "hash", "private_methods", "=~", "tainted?", "include", "irb_cwws", "irb_change_binding", "irb_help", "untaint", "n
il?", "pushb", "exit", "irb_print_working_binding", "is_a?", "workspaces"]
irb(main):037:0>

أنا معتاد على الثعبان ، حيث يمكنني استخدام الدالة dir() لإنجاز نفس الشيء:

>>> dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>>
هل كانت مفيدة؟

المحلول

ObjectSpace.each_object يمكن ما كنت تبحث عن.

للحصول على قائمة شملت وحدات يمكن استخدام وحدة نمطية.included_modules.

يمكنك أيضا التحقق ما إذا كان كائن يستجيب الطريقة على كل حالة على حدة باستخدام الكائن.respond_to?.

نصائح أخرى

أنا لست متأكدا تماما ما تعنيه الحالي الأشياء'.يمكنك تكرار عبر ObjectSpace, كما ذكر سابقا.ولكن هنا هي عدد قليل من الطرق الأخرى.

local_variables
instance_variables
global_variables

class_variables
constants

هناك مسكتك.يجب أن يسمى في نطاقات.حتى في المجلس أو في كائن سبيل المثال أو في فئة النطاق (حتى في كل مكان ، أساسا) يمكنك الاتصال 3 الأولى.

local_variables #=> ["_"]
foo = "bar"
local_variables #=> ["_", "foo"]
# Note: the _ variable in IRB contains the last value evaluated
_ #=> "bar"

instance_variables  #=> []
@inst_var = 42
instance_variables  #=> ["@inst_var"]

global_variables    #=> ["$-d", "$\"", "$$", "$<", "$_", ...]
$"                  #=> ["e2mmap.rb", "irb/init.rb", "irb/workspace.rb", ...]

لكن جامعة محمدية مالانج, ما إذا كنت تريد البرنامج أن يقيم لهم دون الحاجة إلى كتابتها manyally?هو خدعة eval.

eval "@inst_var" #=> 42
global_variables.each do |v|
  puts eval(v)
end

آخر 2 من 5 ذكرت في البداية يجب تقييم مستوى الوحدة النمطية (فئة هو سليل وحدة ، بحيث يعمل).

Object.class_variables #=> []
Object.constants #=> ["IO", "Duration", "UNIXserver", "Binding", ...]

class MyClass
  A_CONST = 'pshh'
  class InnerClass
  end
  def initialize
    @@meh = "class_var"
  end
end

MyClass.constants           #=> ["A_CONST", "InnerClass"]
MyClass.class_variables     #=> []
mc = MyClass.new
MyClass.class_variables     #=> ["@@meh"]
MyClass.class_eval "@@meh"  #=> "class_var"

هنا هي عدد قليل من أكثر الحيل لاستكشاف في اتجاهات مختلفة

"".class            #=> String
"".class.ancestors  #=> [String, Enumerable, Comparable, ...]
String.ancestors    #=> [String, Enumerable, Comparable, ...]

def trace
  return caller
end
trace #=> ["(irb):67:in `irb_binding'", "/System/Library/Frameworks/Ruby...", ...]

على dir() الطريقة لا يعرف بوضوح...

ملاحظة: لأن dir() يتم تزويد في المقام الأول باعتباره الراحة للاستخدام في تفاعلي موجه ، فإنه يحاول توريد مجموعة مثيرة للاهتمام من أسماء أكثر مما يحاول تقدم بدقة أو الدوام المحددة من أسماء مفصلة السلوك قد تتغير عبر النشرات.

لكن نحن يمكن أن تخلق التقريب في روبي.دعونا جعل الطريقة التي سيعود قائمة تم فرزها من جميع طرق وأضاف أن نطاق عملنا من خلال إدراج وحدات.ونحن يمكن الحصول على قائمة من الوحدات التي تم إدراجها باستخدام included_modules الأسلوب.

مثل dir(), نريد أن تجاهل "الافتراضي" الطرق (مثل print), و نحن نريد أيضا أن التركيز على "مثيرة للاهتمام" مجموعة من الأسماء.لذا سوف نتجاهل الطرق في Kernel, ونحن سوف يعود فقط الأساليب التي كانت محددة مباشرة في وحدات تجاهل الأساليب الموروثة.ونحن يمكن أن تنجز في وقت لاحق عن طريق تمرير false في methods() الأسلوب.وضع كل ذلك معا نحصل على...

def included_methods(object=self)
  object = object.class if object.class != Class
  modules = (object.included_modules-[Kernel])
  modules.collect{ |mod| mod.methods(false)}.flatten.sort
end

يمكنك تمرير فئة أو كائن أو لا شيء (من التخلف إلى النطاق الحالي).دعونا نحاول ذلك...

irb(main):006:0> included_methods
=> []
irb(main):007:0> include Math
=> Object
irb(main):008:0> included_methods
=> ["acos", "acosh", "asin", "asinh", "atan", "atan2", "atanh", "cos", "cosh", "erf", "erfc", "exp", "frexp", "hypot", "ldexp", "log", "log10", "sin", "sinh", "sqrt", "tan", "tanh"]

dir() كما تشمل محليا تعريف المتغيرات و هذا سهلا.فقط اتصل...

local_variables

...للأسف لا يمكننا إضافة local_variables دعوة إلى included_methods لأن ذلك سيعطينا المتغيرات المحلية إلى included_methods الطريقة التي لن تكون مفيدة جدا.لذا ، إذا كنت تريد المتغيرات المحلية المضمنة مع included_methods فقط اتصل...

 (included_methods + local_variables).sort

كتبت جوهرة على أن:

$ gem install method_info
$ rvm use 1.8.7 # (1.8.6 works but can be very slow for an object with a lot of methods)
$ irb
> require 'method_info'
> 5.method_info
::: Fixnum :::
%, &, *, **, +, -, -@, /, <, <<, <=, <=>, ==, >, >=, >>, [], ^, abs,
div, divmod, even?, fdiv, id2name, modulo, odd?, power!, quo, rdiv,
rpower, size, to_f, to_s, to_sym, zero?, |, ~
::: Integer :::
ceil, chr, denominator, downto, floor, gcd, gcdlcm, integer?, lcm,
next, numerator, ord, pred, round, succ, taguri, taguri=, times, to_i,
to_int, to_r, to_yaml, truncate, upto
::: Precision :::
prec, prec_f, prec_i
::: Numeric :::
+@, coerce, eql?, nonzero?, pretty_print, pretty_print_cycle,
remainder, singleton_method_added, step
::: Comparable :::
between?
::: Object :::
clone, to_yaml_properties, to_yaml_style, what?
::: MethodInfo::ObjectMethod :::
method_info
::: Kernel :::
===, =~, __clone__, __id__, __send__, class, display, dup, enum_for,
equal?, extend, freeze, frozen?, hash, id, inspect, instance_eval,
instance_exec, instance_of?, instance_variable_defined?,
instance_variable_get, instance_variable_set, instance_variables,
is_a?, kind_of?, method, methods, nil?, object_id, pretty_inspect,
private_methods, protected_methods, public_methods, respond_to?, ri,
send, singleton_methods, taint, tainted?, tap, to_a, to_enum, type,
untaint
 => nil

أنا أعمل على تحسين تمرير الخيارات و الإعدادات الافتراضية ، ولكن الآن أود أن أقترح عليك إضافة التالية إلى الخاص بك .irbrc الملف:

require 'method_info'
MethodInfo::OptionHandler.default_options = {
 :ancestors_to_exclude => [Object],
 :enable_colors => true
}

وهذا يتيح الألوان يخفي الطرق أن كل كائن منذ كنت عادة لا يهتم بهم.

ماذا عن:

Object.constants.select{|x| eval(x.to_s).class == Class}

أن قوائم الفصول الدراسية المتوفرة بالنسبة لي.أنا لا روبي الخبراء و كان يتم إسقاط روبي وحدة التحكم مع أي فكرة ما كانت الطبقات في متناول اليد.أن أحد بطانة بداية.

للوصول إلى كافة مثيلات الكائن في روبي استخدام ObjectSpace

http://www.ruby-doc.org/core-1.8.7/classes/ObjectSpace.html#M000928

إلا أن هذا يعتبر بطيء (حتى بالنسبة روبي), و قد لا يكون ممكنا في بعض المترجمين (مثلا ، jRuby يمكن تعطيل ObjectSpace كما هو أسرع بكثير الاعتماد في jvm على gc دون الحاجة إلى تتبع هذه الأشياء في jRuby).

يمكنك تمرير .أساليب رسائل إلى المكتبة/وحدة حتى قبل تحميله ، لمعرفة كل الطرق المتاحة.القيام self.methods فقط إرجاع كافة أساليب الكائن كائن يحتوي على.يمكنك أن ترى ذلك من خلال القيام self.class.لذلك دعونا نقول كنت تريد أن ترى جميع الطرق في ملف وحدة.يمكنك ببساطة فعل File.methods وستحصل على قائمة بكل الطرق التي توجد في ملف وحدة.هذا ربما ليس ما تريد ، ولكن ينبغي أن تكون مفيدة إلى حد ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top