summaryrefslogtreecommitdiff
path: root/doc/syntax/assignment.rdoc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/syntax/assignment.rdoc')
-rw-r--r--doc/syntax/assignment.rdoc62
1 files changed, 46 insertions, 16 deletions
diff --git a/doc/syntax/assignment.rdoc b/doc/syntax/assignment.rdoc
index 7424d4885f..3988f82e5f 100644
--- a/doc/syntax/assignment.rdoc
+++ b/doc/syntax/assignment.rdoc
@@ -1,6 +1,6 @@
= Assignment
-In Ruby assignment uses the <code>=</code> (equals sign) character. This
+In Ruby, assignment uses the <code>=</code> (equals sign) character. This
example assigns the number five to the local variable +v+:
v = 5
@@ -8,6 +8,9 @@ example assigns the number five to the local variable +v+:
Assignment creates a local variable if the variable was not previously
referenced.
+An assignment expression result is always the assigned value, including
+{assignment methods}[rdoc-ref:@Assignment+Methods].
+
== Local Variable Names
A local variable name must start with a lowercase US-ASCII letter or a
@@ -92,8 +95,9 @@ Now any reference to +big_calculation+ is considered a local variable and will
be cached. To call the method, use <code>self.big_calculation</code>.
You can force a method call by using empty argument parentheses as shown above
-or by using an explicit receiver like <code>self.</code>. Using an explicit
-receiver may raise a NameError if the method's visibility is not public.
+or by using an explicit receiver like <code>self</code>. Using an explicit
+receiver may raise a NameError if the method's visibility is not public or the
+receiver is the literal <code>self</code>.
Another commonly confusing case is when using a modifier +if+:
@@ -103,12 +107,34 @@ Rather than printing "true" you receive a NameError, "undefined local variable
or method `a'". Since ruby parses the bare +a+ left of the +if+ first and has
not yet seen an assignment to +a+ it assumes you wish to call a method. Ruby
then sees the assignment to +a+ and will assume you are referencing a local
-method.
+variable.
The confusion comes from the out-of-order execution of the expression. First
the local variable is assigned-to then you attempt to call a nonexistent
method.
+== Local Variables and eval
+
+Using +eval+ to evaluate Ruby code will allow access to local variables defined
+in the same scope, even if the local variables are not defined until after the
+call to +eval+. However, local variables defined inside the call to +eval+
+will not be reflected in the surrounding scope. Inside the call to +eval+,
+local variables defined in the surrounding scope and local variables defined
+inside the call to +eval+ will be accessible. However, you will not be able
+to access local variables defined in previous or subsequent calls to +eval+ in
+the same scope. Consider each +eval+ call a separate nested scope. Example:
+
+ def m
+ eval "bar = 1"
+ lvs = eval "baz = 2; ary = [local_variables, foo, baz]; x = 2; ary"
+ eval "quux = 3"
+ foo = 1
+ lvs << local_variables
+ end
+
+ m
+ # => [[:baz, :ary, :x, :lvs, :foo], nil, 2, [:lvs, :foo]]
+
== Instance Variables
Instance variables are shared across all methods for the same object.
@@ -136,9 +162,7 @@ Here is an example of instance variable usage:
p object1.value # prints "some value"
p object2.value # prints "other value"
-An uninitialized instance variable has a value of +nil+. If you run Ruby with
-warnings enabled you will get a warning when accessing an uninitialized
-instance variable.
+An uninitialized instance variable has a value of +nil+.
The +value+ method has access to the value set by the +initialize+ method, but
only for the same object.
@@ -255,7 +279,7 @@ An uninitialized global variable has a value of +nil+.
Ruby has some special globals that behave differently depending on context
such as the regular expression match variables or that have a side-effect when
-assigned to. See the {global variables documentation}[rdoc-ref:globals.rdoc]
+assigned to. See the {global variables documentation}[rdoc-ref:language/globals.md]
for details.
== Assignment Methods
@@ -279,7 +303,7 @@ to an instance variable most people use Module#attr_accessor:
end
When using method assignment you must always have a receiver. If you do not
-have a receiver Ruby assumes you are assigning to a local variable:
+have a receiver, Ruby assumes you are assigning to a local variable:
class C
attr_accessor :value
@@ -319,6 +343,9 @@ This prints:
local_variables:
@value: 42
+Note that the value returned by an assignment method is ignored whatever,
+since an assignment expression result is always the assignment value.
+
== Abbreviated Assignment
You can mix several of the operators and assignment. To add 1 to an object
@@ -354,7 +381,7 @@ Here is an example:
p a # prints 1
-Note that these two operators behave more like <code>a || a = 0<code> than
+Note that these two operators behave more like <code>a || a = 0</code> than
<code>a = a || 0</code>.
== Implicit Array Assignment
@@ -374,7 +401,11 @@ assigning. This is similar to multiple assignment:
p a # prints [1, 2, 3]
-You can splat anywhere in the left-hand side of the assignment:
+ b = *1
+
+ p b # prints [1]
+
+You can splat anywhere in the right-hand side of the assignment:
a = 1, *[2, 3]
@@ -382,7 +413,7 @@ You can splat anywhere in the left-hand side of the assignment:
== Multiple Assignment
-You can assign multiple values on the left-hand side to multiple variables:
+You can assign multiple values on the right-hand side to multiple variables:
a, b = 1, 2
@@ -408,8 +439,8 @@ You can use multiple assignment to swap two values in-place:
p new_value: new_value, old_value: old_value
# prints {:new_value=>1, :old_value=>2}
-If you have more values on the left hand side of the assignment than variables
-on the right hand side the extra values are ignored:
+If you have more values on the right hand side of the assignment than variables
+on the left hand side, the extra values are ignored:
a, b = 1, 2, 3
@@ -422,7 +453,7 @@ the assignment.
p a: a, b: b # prints {:a=>1, :b=>[2, 3]}
-The <code>*</code> can appear anywhere on the right-hand side:
+The <code>*</code> can appear anywhere on the left-hand side:
*a, b = 1, 2, 3
@@ -452,4 +483,3 @@ Since each decomposition is considered its own multiple assignment you can use
p a: a, b: b, c: c, d: d
# prints {:a=>1, :b=>2, :c=>[3, 4], :d=>[5, 6]}
-