1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* doc/syntax/control_expressions.rdoc: Omit optional "then" for if and

unless expressions.  Improved description of "a if a = 0.zero?"
  NameError.  Note that "do" for for loop is optional.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38844 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
drbrain 2013-01-15 18:54:54 +00:00
parent 4cf9fa309d
commit a06f22f915
2 changed files with 44 additions and 22 deletions

View file

@ -1,3 +1,9 @@
Wed Jan 16 03:54:28 2013 Eric Hodel <drbrain@segment7.net>
* doc/syntax/control_expressions.rdoc: Omit optional "then" for if and
unless expressions. Improved description of "a if a = 0.zero?"
NameError. Note that "do" for for loop is optional.
Wed Jan 16 03:28:47 2013 Eric Hodel <drbrain@segment7.net>
* doc/syntax/calling_methods.rdoc: Link to defining methods.

View file

@ -27,13 +27,13 @@ The +then+ is optional:
puts "the test resulted in a true-value"
end
This document will include the optional +then+ for all expressions. Many
people omit the +then+ part of the if and other expressions.
This document will omit the optional +then+ for all expressions as that is the
most common usage of +if+.
You may also add an +else+ expression. If the test does not evaluate to true
the +else+ expression will be executed:
if false then
if false
puts "the test resulted in a true-value"
else
puts "the test resulted in a false-value"
@ -46,9 +46,9 @@ You may add an arbitrary number of extra tests to an if expression using
a = 1
if a == 0 then
if a == 0
puts "a is zero"
elsif a == 1 then
elsif a == 1
puts "a is one"
else
puts "a is some other value"
@ -60,15 +60,17 @@ Since +else+ is only executed when there are no matching conditions.
Once a condition matches, either the +if+ condition or any +elsif+ condition,
the +if+ expression is complete and no further tests will be performed.
Like an +if+, an +elsif+ condition may be followed by a +then+.
In this example only "a is one" is printed:
a = 1
if a == 0 then
if a == 0
puts "a is zero"
elsif a == 1 then
elsif a == 1
puts "a is one"
elsif a >= 1 then
elsif a >= 1
puts "a is greater than or equal to one"
else
puts "a is some other value"
@ -77,7 +79,7 @@ In this example only "a is one" is printed:
The tests for +if+ and +elsif+ may have side-effects. The most common use of
side-effect is to cache a value into a local variable:
if a = object.some_value then
if a = object.some_value
# do something to a
end
@ -89,21 +91,23 @@ expression.
The +unless+ expression is the opposite of the +if+ expression. If the value
is false the "then" expression is executed:
unless true then
unless true
puts "the value is a false-value"
end
This prints nothing as true is not a false-value.
You may use an optional +then+ with +unless+ just like +if+.
Note that the above +unless+ expression is the same as:
if not true then
if not true
puts "the value is a false-value"
end
Like an +if+ expression you may use an +else+ condition with +unless+:
unless true then
unless true
puts "the value is false"
else
puts "the value is true"
@ -146,17 +150,18 @@ parse order. Here is an example that shows the difference:
This raises the NameError "undefined local variable or method `a'".
When ruby parses this it first encounters +a+ as a method call in the "then"
expression, then later sees +a+ as a local variable in the "test" expression.
When ruby parses this expression it first encounters +a+ as a method call in
the "then" expression, then later it sees the assignment to +a+ in the "test"
expression and marks +a+ as a local variable.
When running this line it first executes the "test" expression, <code>a =
0.zero?</code>.
Since the test is true it then executes the "then" expression, <code>p
a</code>. Since the +a+ in the body was recorded as a method which does not
exist the NameError is raised.
Since the test is true it executes the "then" expression, <code>p a</code>.
Since the +a+ in the body was recorded as a method which does not exist the
NameError is raised.
The same as true for +unless+.
The same is true for +unless+.
== +case+ Expression
@ -170,7 +175,7 @@ Module#=== and Regexp#=== for examples.
Here is an example of using +case+ to compare a String against a pattern:
case "12345"
when /^1/ then
when /^1/
puts "the string starts with one"
else
puts "I don't know what the string starts with"
@ -194,7 +199,7 @@ result as the one above:
You may place multiple conditions on the same +when+:
case "2"
when /^1/, "2" then
when /^1/, "2"
puts "the string starts with one or is '2'"
end
@ -202,14 +207,23 @@ Ruby will try each condition in turn, so first <code>/^1/ === "2"</code>
returns +false+, then <code>"2" === "2"</code> returns +true+, so "the string
starts with one or is '2'" is printed.
You may use +then+ after the +when+ condition. This is most frequently used
to place the body of the +when+ on a single line.
case a
when 1, 2 then puts "a is one or two
when 3 then puts "a is three"
else puts "I don't know what a is"
end
The other way to use a +case+ expression is like an if-elsif expression:
a = 2
case
when a == 1, a == 2 then
when a == 1, a == 2
puts "a is one or two"
when a == 3 then
when a == 3
puts "a is three"
else
puts "I don't know what a is"
@ -282,6 +296,8 @@ The +do+ is optional:
Prints 1, 2 and 3.
Like +while+ and +until+, the +do+ is optional.
The +for+ loop is similar to using #each, but does not create a new variable
scope.