Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you list the currently available objects in the current scope in ruby?

I'm new to ruby and I'm playing around with the IRB.

I found that I can list methods of an object using the ".methods" method, and that self.methods sort of give me what I want (similar to Python's dir(builtins)?), but how can I find the methods of a library/module I've loaded via include and require?

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> 

I'm used to python, where I use the dir() function to accomplish the same thing:

>>> dir() ['__builtins__', '__doc__', '__name__', '__package__'] >>> 
like image 640
monkut Avatar asked Oct 23 '08 05:10

monkut


People also ask

What is scope method in Ruby?

Scopes are custom queries that you define inside your Rails models with the scope method. Every scope takes two arguments: A name, which you use to call this scope in your code. A lambda, which implements the query.

What are objects in Ruby?

Object: That's just any piece of data. Like the number 3 or the string 'hello'. Class: Ruby separates everything into classes. Like integers, floats and strings. Method: These are the things that you can do with an object.

What does Ruby provide to allow the creation of object specific methods?

When you call Song. new to create a new Song object, Ruby creates an uninitialized object and then calls that object's initialize method, passing in any parameters that were passed to new . This gives you a chance to write code that sets up your object's state.

What is object class in Ruby?

Object is the default root of all Ruby objects. Object inherits from BasicObject which allows creating alternate object hierarchies. Methods on Object are available to all classes unless explicitly overridden. Object mixes in the Kernel module, making the built-in kernel functions globally accessible.


1 Answers

I'm not entirely sure of what you mean by the 'current objects'. You can iterate over ObjectSpace, as has been mentioned already. But here are a few other methods.

local_variables instance_variables global_variables  class_variables constants 

There's one gotcha. They must be called at the right scopes. So right in IRB, or in an object instance or at class scope (so everywhere, basically) you can call the first 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", ...] 

But umm, what if you want your program to actually evaluate them without needing you to type them manyally? The trick is eval.

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

The last 2 of the 5 mentioned at the beginning must be evaluated at the module level (a class is a descendant of a module, so that works).

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" 

Here's are a few more tricks to explore in different directions

"".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...", ...] 
like image 138
webmat Avatar answered Nov 05 '22 17:11

webmat