summaryrefslogtreecommitdiff
path: root/doc/syntax/miscellaneous.rdoc
blob: d5cfd3e474219b5852bce8dedd5abcf7d7e7824f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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'