summaryrefslogtreecommitdiff
path: root/doc/syntax/miscellaneous.rdoc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/syntax/miscellaneous.rdoc')
-rw-r--r--doc/syntax/miscellaneous.rdoc136
1 files changed, 136 insertions, 0 deletions
diff --git a/doc/syntax/miscellaneous.rdoc b/doc/syntax/miscellaneous.rdoc
new file mode 100644
index 0000000000..d5cfd3e474
--- /dev/null
+++ b/doc/syntax/miscellaneous.rdoc
@@ -0,0 +1,136 @@
+= Miscellaneous Syntax
+
+== Ending an Expression
+
+Ruby uses a newline as the end of an expression. When ending a line with an
+operator, open parentheses, comma, etc. the expression will continue.
+
+You can end an expression with a <code>;</code> (semicolon). Semicolons are
+most frequently used with <code>ruby -e</code>.
+
+== Indentation
+
+Ruby does not require any indentation. Typically, ruby programs are indented
+two spaces.
+
+If you run ruby with warnings enabled and have an indentation mismatch, you
+will receive a warning.
+
+== +alias+
+
+The +alias+ keyword is most frequently used to alias methods. When aliasing a
+method, you can use either its name or a symbol:
+
+ alias new_name old_name
+ alias :new_name :old_name
+
+For methods, Module#alias_method can often be used instead of +alias+.
+
+You can also use +alias+ to alias global variables:
+
+ $old = 0
+
+ alias $new $old
+
+ p $new # prints 0
+
+You may use +alias+ in any scope.
+
+== +undef+
+
+The +undef+ keyword prevents the current class from responding to calls to the
+named methods.
+
+ undef my_method
+
+You may use symbols instead of method names:
+
+ undef :my_method
+
+You may undef multiple methods:
+
+ undef method1, method2
+
+You may use +undef+ in any scope. See also Module#undef_method
+
+== +defined?+
+
++defined?+ is a keyword that returns a string describing its argument:
+
+ p defined?(UNDEFINED_CONSTANT) # prints nil
+ p defined?(RUBY_VERSION) # prints "constant"
+ p defined?(1 + 1) # prints "method"
+
+You don't need to use parenthesis with +defined?+, but they are recommended due
+to the {low precedence}[rdoc-ref:syntax/precedence.rdoc] of +defined?+.
+
+For example, if you wish to check if an instance variable exists and that the
+instance variable is zero:
+
+ defined? @instance_variable && @instance_variable.zero?
+
+This returns <code>"expression"</code>, which is not what you want if the
+instance variable is not defined.
+
+ @instance_variable = 1
+ defined?(@instance_variable) && @instance_variable.zero?
+
+Adding parentheses when checking if the instance variable is defined is a
+better check. This correctly returns +nil+ when the instance variable is not
+defined and +false+ when the instance variable is not zero.
+
+Using the specific reflection methods such as instance_variable_defined? for
+instance variables or const_defined? for constants is less error prone than
+using +defined?+.
+
++defined?+ handles some regexp global variables specially based on whether
+there is an active regexp match and how many capture groups there are:
+
+ /b/ =~ 'a'
+ defined?($~) # => "global-variable"
+ defined?($&) # => nil
+ defined?($`) # => nil
+ defined?($') # => nil
+ defined?($+) # => nil
+ defined?($1) # => nil
+ defined?($2) # => nil
+
+ /./ =~ 'a'
+ defined?($~) # => "global-variable"
+ defined?($&) # => "global-variable"
+ defined?($`) # => "global-variable"
+ defined?($') # => "global-variable"
+ defined?($+) # => nil
+ defined?($1) # => nil
+ defined?($2) # => nil
+
+ /(.)/ =~ 'a'
+ defined?($~) # => "global-variable"
+ defined?($&) # => "global-variable"
+ defined?($`) # => "global-variable"
+ defined?($') # => "global-variable"
+ defined?($+) # => "global-variable"
+ defined?($1) # => "global-variable"
+ defined?($2) # => nil
+
+== +BEGIN+ and +END+
+
++BEGIN+ defines a block that is run before any other code in the current file.
+It is typically used in one-liners with <code>ruby -e</code>. Similarly +END+
+defines a block that is run after any other code.
+
++BEGIN+ must appear at top-level and +END+ will issue a warning when you use it
+inside a method.
+
+Here is an example:
+
+ BEGIN {
+ count = 0
+ }
+
+You must use <code>{</code> and <code>}</code> you may not use +do+ and +end+.
+
+Here is an example one-liner that adds numbers from standard input or any files
+in the argument list:
+
+ ruby -ne 'BEGIN { count = 0 }; END { puts count }; count += gets.to_i'