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__'] >>>
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.
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.
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.
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.
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...", ...]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With