![Page 1: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/1.jpg)
CMSC 330: Organization of Programming Languages
Equality, Mixin Inheritance, Miscellany
1CMSC 330 - Fall 2019
![Page 2: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/2.jpg)
Object Copy vs. Reference Copy
Consider the following code
• Assume an object/reference model like Java or Ruby
Ø Or even two pointers pointing to the same structure
Which of these occur?
Object copy Reference copy
x = "groundhog" ; y = x
x "groundhog"(reference) (object)
y "groundhog"
x(reference) "groundhog"
(object)y
2CMSC 330 - Fall 2019
![Page 3: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/3.jpg)
Object Copy vs. Reference Copy (cont.)
For• Ruby and Java would both do a reference copy
But for
• Ruby would cause an object copy• Unnecessary in Java since Strings are immutable
x = "groundhog"y = String.new(x)
x = "groundhog" ; y = x
3CMSC 330 - Fall 2019
![Page 4: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/4.jpg)
Physical vs. Structural Equality
Consider these cases again:
If we compare x and y, what is compared?• The references, or the contents of the objects they
point to?If references are compared (physical equality) the first would return false but the second trueIf objects are compared both would return true
x "groundhog"(reference) (object)
y "groundhog"
x(reference) "groundhog"
(object)y
4CMSC 330 - Fall 2019
![Page 5: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/5.jpg)
String Equality
In Java, x == y is physical equality, always• Compares references, not string contents
In Ruby, x == y for strings uses structural equality• Compares contents, not references• == is a method that can be overridden in Ruby!• To check physical equality, use the equal? method
Ø Inherited from the Object class
It’s always important to know whether you’re doing a reference or object copy• And physical or structural comparison
5CMSC 330 - Fall 2019
![Page 6: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/6.jpg)
Comparing Equality
Language Physical equality Structural equalityJava a == b a.equals(b)
C a == b *a == *b
Ruby a.equal?(b) a == b
Ocaml a == b a = b
Python a is b a == b
Scheme (eq? a b) (equal? a b)
Visual Basic .NET a Is b a = b
6CMSC 330 - Fall 2019
![Page 7: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/7.jpg)
Quiz 1: Which is true?
a) Structural equality implies physical equalityb) Physical equality implies structural equalityc) Physical equality does not work for cyclic data
structuresd) == always means physical equality
CMSC 330 - Fall 2019 7
![Page 8: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/8.jpg)
Quiz 1: Which is true?
a) Structural equality implies physical equalityb) Physical equality implies structural equalityc) Physical equality does not work for cyclic data
structuresd) == always means physical equality
CMSC 330 - Fall 2019 8
![Page 9: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/9.jpg)
Comparisons
Sorting requires ability to compare two valuesRuby comparison method <=>
Ø -1 = lessØ 0 = equalsØ +1 = greater
Examples• 3 <=> 4 returns -1• 4 <=> 3 returns +1• 3 <=> 3 returns 0
9CMSC 330 - Fall 2019
![Page 10: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/10.jpg)
Sorting
Two ways to sort an Array• Default sort (puts values in ascending order)
Ø [2,5,1,3,4].sort # returns [1,2,3,4,5]
• Custom sort (based on value returned by code block} Ø [2,5,1,3,4].sort { |x,y| y <=> x } # returns [5,4,3,2,1]Ø Where -1 = less, 0 = equals, +1 = greaterØ Code block return value used for comparisons
10CMSC 330 - Fall 2019
![Page 11: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/11.jpg)
Quiz 2: What is the output?print [1,4,7,3,2].sort { |x,y| (x % 2) <=> (y % 2) }
• Recall that % is the modulus operator• And <=> is the built in comparison operator
a)[1, 2, 3, 4, 7]b)[4, 2, 1, 7, 3]c)[1, 7, 3, 4, 2]d)[7, 4, 3, 2, 1]
CMSC 330 - Fall 2019 11
![Page 12: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/12.jpg)
Quiz 2: What is the output?
print [1,4,7,3,2].sort { |x,y| (x % 2) <=> (y % 2) }
• Recall that % is the modulus operator
• And <=> is the built in comparison operator
a)[1, 2, 3, 4, 7]b)[4, 2, 1, 7, 3] – evens, then odds, in original order
c)[1, 7, 3, 4, 2]d)[7, 4, 3, 2, 1]
CMSC 330 - Fall 2019 12
![Page 13: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/13.jpg)
Ranges
1..3 is an object of class Range• Integers between 1 and 3 inclusively
1…3 also has class Range• Integers between 1 and 3 but not including 3 itself.
Not just for integers• ‘a’..’z’ represents the range of letters ‘a’ to ‘z’• 1.3…2.7 is the continuous range [1.3,2.7)
Ø (1.3…2.7).include? 2.0 # => true
Discrete ranges offer the each method to iterate• And can convert to an array via to_a; e.g., (1..2).to_a
13CMSC 330 - Fall 2019
![Page 14: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/14.jpg)
Special Global Variables
Ruby has a special set of global variables that are implicitly set by methodsThe most insidious one: $_• Last line of input read by gets or readline
Example program
Using $_ leads to shorter programs• And confusion• We suggest you avoid using it
gets # implicitly reads input line into $_print # implicitly prints out $_
14CMSC 330 - Fall 2019
![Page 15: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/15.jpg)
Mixins
Inheritance is one form of code reuseAnother form of code reuse is “mix-in” inclusion• include A “inlines” A’s methods at that point
Ø Referred-to variables/methods captured from contextØ In effect: it adds those methods to the current class
To define a mixin, use a module for A, not class
15CMSC 330 - Fall 2019
![Page 16: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/16.jpg)
Ruby Modules
A module is a collection of methods and constants• Module methods can be called directly
Ø So module defines a namespace for those methods
• Instance methods are “mixed in” to another class
16CMSC 330 - Fall 2019
module Doublerdef Doubler.base # module method
2enddef double # instance method
self + selfend
end
Doubler.base=> 2
Doubler.class=> Module
Doubler.new #err, no method
Doubler.double #err, no method
Doubler.instance_methods
=> [:double]
![Page 17: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/17.jpg)
Mixin Modules
17CMSC 330 - Fall 2019
module Doublerdef double
self + selfend
end
class Integer # extends Integerinclude Doubler
end
10.double => 20
class String # extends Stringinclude Doubler
end
"hello".double => "hellohello"
Inserts instance methods from Doubler into the class Integer
![Page 18: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/18.jpg)
Mixin Method Lookup
When you call method m of class C, look for m1. in class C …2. in mixin in class C …
• if multiple mixins included, start in latest mixin, then try earlier (shadowed) ones …
3. in C's superclass …4. in C's superclass mixin …5. in C's superclass's superclass …6. …
CMSC 330 - Fall 2019 18
![Page 19: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/19.jpg)
Mixin Example 1
CMSC 330 - Fall 2019 19
module M1def hello
"M1 hello"end
end
module M2def hello
"M2 hello"end
end
class Ainclude M1include M2def hello
"A hello"end
end
a = A.newa.hello
=> “A hello”a.class.ancestors
=> [A, M2, M1, Object, Kernel, BasicObject]
![Page 20: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/20.jpg)
Quiz 3: What is the output?
CMSC 330 - Fall 2019 20
module M1def hello
"M1 hello"end
end
module M2def hello
"M2 hello"end
end
class Ainclude M1include M2
end
• class A does not have a method hello. • Both M1 and M2 have a method hello.
M2's hello shadows M1’s.
a = A.newputs a.hello
a. “A hello”b. “M1 hello”c. “M2 hello”d. (nothing)
![Page 21: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/21.jpg)
Quiz 3: What is the output?
CMSC 330 - Fall 2019 21
module M1def hello
"M1 hello"end
end
module M2def hello
"M2 hello"end
end
class Ainclude M1include M2
end
a = A.newputs a.hello
• class A does not have a method hello. • Both M1 and M2 have a method hello.
M2's hello shadows M1’s.
a. “A hello”b. “M1 hello”c. “M2 hello”d. (nothing)
![Page 22: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/22.jpg)
Mixin Example 3
CMSC 330 - Fall 2019 22
module M1def hello
"m1 says hello, " + superenddef what
"Mary"end
endclass A
def hello"A says hello, " + what
enddef what
"Alice"end
endclass B < A
include M1def hello
"B says hello, " + superenddef what
"Bob"end
end
b = B.newb.class.ancestors => [B, M1, A, Object, Kernel, BasicObject]b.hello=>B says hello, m1 says hello, A says hello, Bob
B's hello is called. super called B's superclass M1's hello. super in M1's hello called hello in superclass A. At the end, the "what" method of the current object "b" is called.
![Page 23: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/23.jpg)
Mixins: Comparable
23
class OneDPointattr_accessor :xinclude Comparable
def <=>(other) #used by Comparableif @x < other.x then return -1elsif @x > other.x then return 1else return 0end
endend
p = OneDPoint.newp.x = 1q = OneDPoint.newq.x = 2x < y # trueputs [y,x].sort# prints x, then y
CMSC 330 - Fall 2019
![Page 24: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/24.jpg)
Mixins: Enumerable
CMSC 330 - Fall 2019 24
class MyRangeinclude Enumerable #map,select, inject, collect, find
def initialize(low,high)@low = low #(2,8)@high = high
enddef each #used by Enumerable
i=@lowwhile i <= @high
yield ii=i+1
endend
end
![Page 25: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/25.jpg)
Ruby Summary
InterpretedImplicit declarationsDynamically typedBuilt-in regular expressionsEasy string manipulationObject-oriented• Everything (!) is an object
Code blocks• Easy higher-order programming!• Get ready for a lot more of this...
Makes it quick to write small programs
Hallmark of scripting languages
25CMSC 330 - Fall 2019
![Page 26: CMSC 330: Organization of Programming Languages · Ruby Modules A module is a collection of methods and constants •Module methodscan be called directly ØSo module defines a namespacefor](https://reader033.vdocuments.us/reader033/viewer/2022050607/5faea04497e0be097314d4bc/html5/thumbnails/26.jpg)
Other Scripting Languages
Perl and Python are also popular scripting languages• Also are interpreted, use implicit declarations and
dynamic typing, have easy string manipulation• Both include optional �compilation� for speed of
loading/executionWill look fairly familiar to you after Ruby• Lots of the same core ideas• All three have their proponents and detractors• Use whichever language you personally prefer
26CMSC 330 - Fall 2019