Transcript Ruby Intro
and other languages…
The
Ruby Programming Language,
Flanagan & Matsumoto (creator of Ruby)
•
•
•
How to execute
Program structure
Variables
•
•
•
• name, keywords, binding, scope,
• Threads
• Reflection
• Libraries
lifetime
•
Data types
–
–
–
–
•
type system
primitives, strings, arrays, hashes
pointers/references
type conversions and equality
short-circuiting, conditional
expression
– Referential transparency
– Statements vs Expressions
•
Control flow
– conditionals
– loops
•
•
Functional Language – other
aspects, covered later
•
QUICK EX: With a partner
Expressions
– Operators, overloading, booleans,
Functions
Classes
Exception handling
Other features
• how do you learn a new
programming language?
• What types of programs do you
write?
A
binding is an association, such as:
• bind type of variable
• bind operation to symbol (e.g., meaning of *)
• bind function to its definition
Binding
time is the time at which a
binding takes place.
Type binding
• may be static or dynamic
• explicit or implicit
Language design time -- bind operator symbols to operations :
sum = sum + count
Language implementation time-- bind type to a representation :
int => number of bits, etc.
Compile time -- bind a variable to a type: int count;
Link time – bind library subprogram to code: cout << x;
Load time -- bind a FORTRAN 77 variable to a memory cell (or a
C static variable)
Runtime -- bind a nonstatic local variable to a memory cell
A
binding is static if it first occurs before run
time and remains unchanged throughout
program execution.
A binding is dynamic if it first occurs during
execution or can change during execution of the
program
NOTE: doesn't
consider paging etc. which is at
the hardware level
Type
not specified by declaration, not
determined by name (JavaScript, PHP, Ruby)
Specified through an assignment statement
list = [2, 4.33, 6, 8];
list = 17.3;
• Advantage: flexibility (generic program units)
• Disadvantages:
High cost (dynamic type checking requires run-time
descriptors, normally interpreted… upcoming discussion)
Type error detection by the compiler is difficult
How are generic program units done in C++? Java?
How
would dynamic types be
implemented? What data structure(s)
would you use? How does this impact
your code – consider efficiency,
reliability.
Now think about challenges with +
•
•
•
•
total = 3 + 5
message = “hello” + “ world”
something = “count “ + 3 + 5
other = 3 + “count”
i = x; // desired, x is scalar
i = y; // typed accidentally, y is array
An explicit declaration is a program statement used for
declaring the types of variables: int count;
An implicit declaration is a default mechanism for
specifying types of variables (the first appearance of
the variable in the program)
Both create static bindings to types (i.e., type doesn’t
change during execution of program)
FORTRAN, PL/I, BASIC, and Perl provide implicit
declarations
• Advantage: writability
• Disadvantage: reliability
Perl: @ is array, % is hash, $ is scalar
Fortran: I-N integer, others single precision, can
override
many
words have special meaning (e.g. if, true,
def, etc.)
Keyword: has special meaning in particular
context, but can be used as variable name
• Algol, PL/I
Reserved: can’t
be used as variable
• COBOL has ~400, Java has ~50
• Advantage: may avoid confusion
• Disadvantage: may need to be aware of language
parts you aren’t even using
Compare to Java/C++
Basic
unit is expression
Primary expressions: true, false, nil, self,
number and string literals, variable
references (all represent values)
Expression types: arithmetic, boolean
Code can be organized using:
•
•
•
•
Blocks
Methods
Classes
Modules
Expression vs statement?
Ruby
is a scripting language
No special main method
In general, script starts executing with
line 1, continues until all lines executed
Methods/classes come into existence
when they are read in the file. Method
calls must be placed after the method
definitions
open
IRB
puts “say Hi”
say Hi
nil
nil
is return… ruby has expressions, not
statements
Open
text editor
puts “say Hi”
save file as demo1.rb
at command line: ruby demo1.rb
Whitespace: mostly
ignored
Expression separators: newline
• use caution if statement doesn’t fit on one line
• insert newline after operator, period or comma
• OR escape the newline *
Compare to Java/C++/Python
* think: how does interpreter recognize tokens/statement?
10.times { puts “hello” }
block surrounded by { }
x=5
unless x == 10
call this the “body”
print x often
never delimit with { }
end block delimited by “end”
Blocks
can be nested. Indent for clarity.
Compare to Java/C++
# This is a comment
OR
=begin
This is a longer comment. =begin/=end
must be at the start of a line
=end
length: no limit (afaik)
valid characters:
•
•
•
•
•
•
•
•
•
letters, numbers, _
can’t start with number
$ used as first character of global var
@/@@ used to identify instance and class variables
? (convention) end method name with ? if returns boolean
! (convention) end method name with ! if dangerous
= used to make assignments (covered with classes)
no other punctuation
support for Unicode
first letter (enforced by ruby):
• Constants, classes and modules begin with A-Z
case sensitive
Compare to Java/C++/Fortran
Numeric
• Integer – allows base 8, 16, 2 (binary)
C++ has unsigned ints, Java does not…
Fixnum: fit in 31 bits
concept doesn’t apply to Ruby – why?
Bignum: arbitrary size
• Float – includes scientific notation
• Complex
• BigDecimal: use decimal rather than binary rep
• Rational
COBOL was for business… inherent big
decimal. Java/C# provide. C++ does not.
Adv: accuracy. Disadv: waste space
div
= integer division, e.g., 7.div 3
fdiv = floating point division, e.g., 7.fdiv 3
quo = rational division
-7/3 = -3 in Ruby, -2 in Java/C++
Float::MAX
Infinity
Numbers
are immutable (as you’d expect)
String literals – single quote
• ‘A ruby string’
• ‘Didn\’t you have fun?’
• Only escape \’ or \\
• newlines are embedded if multi-line
String literals – double quote
• normal escape sequences (\t, \n etc)
• string interpolation
w=5
h=4
puts "The area is #{w*h}"
Other languages with interpolation?
Strings are mutable in Ruby
+ is concatenation (often prefer interpolation)
age = 32
puts "I am " + age.to_s
<< is append
s = "Hello"
s << " World"
puts s
Extract characters
puts s[0, 5]
* repeats text
puts "hey " * 5
Java converts right-hand to string, Ruby
doesn’t
Changed
from Ruby 1.8 to Ruby 1.9
Characters are now strings of length 1
Python also has strings of length 1, not primitive chars
Not covered
• multi-byte characters (need for unicode… 16-bit
encoding, first 128 the same as ASCII)
• specify encodings (e.g., ASCII-8BIT, BINARY, USASCII, ASCII, ISO-8859-15, UTF-8)
• many other String methods, such as downcase,
upcase, chop, delete, tr, etc.
Does Java support unicode? Does C++?
No
( ) needed for function invocation
Try it:
"hello".center 20
"hello".delete "lo"
note: if use (), don’t
• f(3+2)+1 != f (3+2)+1
put space after fn name!
What’s
good practice? Here are some
thoughts:
http://stackoverflow.com/questions/340624/
do-you-leave-parentheses-in-or-out-in-ruby
Compare to Java/C++/Python
Can
use [] with, e.g., s = "cats rule"
• [ix] # puts s[0]
• [ix,len] # puts s[0,4]
• [ix..ix] # puts s[0..3]
• [-ix] #puts s[-4, 4]
• puts s.length
if
index too large, just returns nil
Compare to C/C++
Can use [] with:
•
•
•
•
•
[ix]
[ix,len]
[ix..ix]
[-ix]
stringname.length, etc.
if index too large, just returns nil
Try:
• s = "Sunday, Monday, Tuesday, Wednesday, Thursday, Friday"
• Find different ways to extract Sunday, Monday and Friday using
the index options shown above
• Use different ways to modify the string (e.g., convert the string
to:
Monday, day, Tuesday, Wednesday, Thursday, Saturday)
Nothing to submit; no right answers – just play!
Compare to C/C++
Do
Ruby Intro homework
Language concepts
• Effect of syntax on compilation
• Binding
overview
static vs dynamic
explicit vs implicit types
• Scripting language
• Keywords vs Reserved words
Ruby
Basics
• program structure
• program execution
• block structure
• methods
• comments
• variables
• strings
interpolation
• numbers
May
use BEGIN/END (not common to do)
• BEGIN { # global init code ]
• END { #global shutdown code]
• if multiple BEGINS, interpreter executes in order
read