Ruby logistics. CSE341: Programming Languages Lecture 19 Introduction to Ruby and OOP. Ruby: Not our focus. Ruby: Our focus. A note on the homework

Similar documents
CSE341: Programming Languages Lecture 19 Introduction to Ruby and OOP. Dan Grossman Winter 2013

Ruby. Mooly Sagiv. Most slides taken from Dan Grossman

CSE 341, Autumn 2015, Ruby Introduction Summary

CSE341: Programming Languages Spring 2017 Unit 7 Summary Dan Grossman, University of Washington

Smalltalk: developed at Xerox Palo Alto Research Center by the Learning Research Group in the 1970 s (Smalltalk-72, Smalltalk-76, Smalltalk-80)

CSE341: Programming Languages Lecture 20 Arrays and Such, Blocks and Procs, Inheritance and Overriding. Dan Grossman Spring 2017

CSE 341: Programming Languages

CSE 413 Spring Introduction to Ruby. Credit: Dan Grossman, CSE341

Today. CSE341: Programming Languages. Late Binding in Ruby Multiple Inheritance, Interfaces, Mixins. Ruby instance variables and methods

CS 5142 Scripting Languages

CSE341: Programming Languages Lecture 23 Multiple Inheritance, Mixins, Interfaces, Abstract Methods. Dan Grossman Autumn 2018

Racket. CSE341: Programming Languages Lecture 14 Introduction to Racket. Getting started. Racket vs. Scheme. Example.

CSE 303: Concepts and Tools for Software Development

Ruby: Introduction, Basics

CSE341: Programming Languages Lecture 9 Function-Closure Idioms. Dan Grossman Winter 2013

CSE341: Programming Languages Lecture 22 OOP vs. Functional Decomposition; Adding Operators & Variants; Double-Dispatch. Dan Grossman Autumn 2018

Ruby: Introduction, Basics

Lecture 2. Object Orientation 1 / 51

CSE 374 Programming Concepts & Tools. Hal Perkins Spring 2010

CSE413: Programming Languages and Implementation Racket structs Implementing languages with interpreters Implementing closures

Lecture 2. Object Orientation

Lecture 2. Object Orientation 1 / 50

Late Binding; OOP as a Racket Pattern

CSE341: Programming Languages Lecture 25 Subtyping for OOP; Comparing/Combining Generics and Subtyping. Dan Grossman Winter 2013

CSE 413 Languages & Implementation. Hal Perkins Winter 2019 Structs, Implementing Languages (credits: Dan Grossman, CSE 341)

CSE : Python Programming

Ruby: Introduction, Basics

CSE341: Programming Languages Lecture 26 Course Victory Lap. Dan Grossman Spring 2016

CS-XXX: Graduate Programming Languages. Lecture 22 Class-Based Object-Oriented Programming. Dan Grossman 2012

AP Computer Science Chapter 10 Implementing and Using Classes Study Guide

CSE341, Fall 2011, Lecture 26 Summary

CSE 374 Programming Concepts & Tools. Hal Perkins Fall 2015 Lecture 19 Introduction to C++

15.1 Origins and Uses of Ruby

CSE 341: Programming Languages

JAVASCRIPT AND JQUERY: AN INTRODUCTION (WEB PROGRAMMING, X452.1)

CSE341: Programming Languages Lecture 9 Function-Closure Idioms. Dan Grossman Fall 2011

Ruby: Objects and Dynamic Types

CSE341: Programming Languages Lecture 17 Implementing Languages Including Closures. Dan Grossman Autumn 2018

S206E Lecture 19, 5/24/2016, Python an overview

CSE 341: Programming Languages. Section AC with Nate Yazdani

CSE341: Programming Languages Lecture 4 Records, Datatypes, Case Expressions. Dan Grossman Spring 2013

Don t Believe the Hype. CS152: Programming Languages. Lecture 21 Object-Oriented Programming. Class-based OOP. So what is OOP?

CSE341: Programming Languages Lecture 15 Macros. Zach Tatlock Winter 2018

What is a macro. CSE341: Programming Languages Lecture 15 Macros. Example uses. Using Racket Macros. Zach Tatlock Winter 2018

CSE 341: Programming Languages

CSE341 Spring 2017, Final Examination June 8, 2017

CSc 372 Comparative Programming Languages

CSE341: Programming Languages Lecture 7 First-Class Functions. Dan Grossman Winter 2013

The System Transcript, Class Point and Inspectors

CSE341 Spring 2017, Final Examination June 8, 2017

CS152: Programming Languages. Lecture 24 Bounded Polymorphism; Classless OOP. Dan Grossman Spring 2011

PREPARING FOR PRELIM 2

CS152: Programming Languages. Lecture 11 STLC Extensions and Related Topics. Dan Grossman Spring 2011

CSE341, Spring 2013, Final Examination June 13, 2013

What is Ruby? CSc 372. Comparative Programming Languages. 27 : Ruby Introduction. Department of Computer Science University of Arizona

Overview of the Ruby Language. By Ron Haley

CS 231 Data Structures and Algorithms, Fall 2016

CSE 341 : Programming Languages

Java Bytecode (binary file)

Classes and Methods עזאם מרעי המחלקה למדעי המחשב אוניברסיטת בן-גוריון מבוסס על השקפים של אותו קורס שניתן בשנים הקודמות

Goal. CS152: Programming Languages. Lecture 15 Parametric Polymorphism. What the Library Likes. What The Client Likes. Start simpler.

CSE341, Fall 2011, Lecture 12 Summary

Typical workflow. CSE341: Programming Languages. Lecture 17 Implementing Languages Including Closures. Reality more complicated

CS 349 / SE 382 Scripting. Professor Michael Terry March 18, 2009

Interfaces, Mixins, & Multiple Inheritance

What is a class? Responding to messages. Short answer 7/19/2017. Code Listing 11.1 First Class. chapter 11. Introduction to Classes

CSE341 Spring 2016, Final Examination June 6, 2016

Overview. Elements of Programming Languages. Advanced constructs. Motivating inner class example

Introducing Wybe a language for everyone

Java Object Oriented Design. CSC207 Fall 2014


CSE341: Programming Languages Lecture 11 Type Inference. Dan Grossman Spring 2016

Definition of DJ (Diminished Java)

CSE 413 Programming Languages & Implementation. Hal Perkins Winter 2019 Ruby Containers, Blocks, and Procs

A PROGRAM IS A SEQUENCE of instructions that a computer can execute to

Client Code - the code that uses the classes under discussion. Coupling - code in one module depends on code in another module

Your First Ruby Script

Classes and Methods לאוניד ברנבוים המחלקה למדעי המחשב אוניברסיטת בן-גוריון

CS162 Week 1. Kyle Dewey. Friday, January 10, 14

G52CPP C++ Programming Lecture 9

Node.js Training JavaScript. Richard richardrodger.com

COMP-202 Unit 8: Defining Your Own Classes. CONTENTS: Class Definitions Attributes Methods and Constructors Access Modifiers and Encapsulation

Unit3: Java in the large. Prepared by: Dr. Abdallah Mohamed, AOU-KW

CS-XXX: Graduate Programming Languages. Lecture 9 Simply Typed Lambda Calculus. Dan Grossman 2012

Lecture 02, Fall 2018 Friday September 7

Review. CS152: Programming Languages. Lecture 11 STLC Extensions and Related Topics. Let bindings (CBV) Adding Stuff. Booleans and Conditionals

CPS 506 Comparative Programming Languages. Programming Language

G52CPP C++ Programming Lecture 7. Dr Jason Atkin

CSE 331 Software Design and Implementation. Lecture 14 Generics 2

Intro. Scheme Basics. scm> 5 5. scm>

CSCI-GA Scripting Languages

CS558 Programming Languages Winter 2018 Lecture 4a. Andrew Tolmach Portland State University

To figure this out we need a more precise understanding of how ML works

Classes and Methods גרא וייס המחלקה למדעי המחשב אוניברסיטת בן-גוריון

CMSC 330: Organization of Programming Languages. OCaml Imperative Programming

Modules, Structs, Hashes, and Operational Semantics

Upcoming Features in C# Mads Torgersen, MSFT

CS 11 Haskell track: lecture 1

Ruby on Rails TKK, Otto Hilska

CS558 Programming Languages

Transcription:

Ruby logistics CSE341: Programming Languages Lecture 19 Introduction to Ruby and OOP Dan Grossman Autumn 2018 Next two sections use the Ruby language http://www.ruby-lang.org/ Installation / basic usage instructions on course website Version 2.X.Y required, but differences not so relevant Excellent documentation available, much of it free So may not cover every language detail in course materials http://ruby-doc.org/ http://www.ruby-lang.org/en/documentation/ Particularly recomm Programming Ruby 1.9 & 2.0, The Pragmatic Programmers Guide Not free 2 Ruby: Our focus Ruby: Not our focus Pure object-oriented: all values are objects (even numbers) Class-based: Every object has a class that determines behavior Like Java, unlike Javascript Mixins (neither Java interfaces nor C++ multiple inheritance) Dynamically typed Convenient reflection: Run-time inspection of objects Very dynamic: Can change classes during execution Blocks and libraries encourage lots of closure idioms Syntax, scoping rules, semantics of a scripting language Variables spring to life on use Very flexible arrays Lots of support for string manipulation and regular expressions Popular for server-side web applications Ruby on Rails Often many ways to do the same thing More of a why not add that too? approach 3 4 Where Ruby fits A note on the homework dynamically typed statically typed functional Racket SML object-oriented (OOP) Ruby Java Note: Racket also has classes and objects when you want them In Ruby everything uses them (at least implicitly) Historical note: Smalltalk also a dynamically typed, class-based, pure OOP language with blocks and convenient reflection Smaller just-as-powerful language Ruby less simple, more modern and useful Dynamically typed OOP helps identify OOP's essence by not having to discuss types Next homework is about understanding and exting an existing program in an unfamiliar language Good practice Quite different feel than previous homeworks Read code: determine what you do and do not (!) need to understand Homework requires the Tk graphics library to be installed such that the provided Ruby code can use it 5 6

Getting started The rules of class-based OOP See lec19_silly.rb file for our getting-started program Can run file foo.rb at the command-line with ruby foo.rb Or can use irb, which is a REPL Run file foo.rb with load "foo.rb" In Ruby: 1. All values are references to objects 2. Objects communicate via method calls, also known as messages 3. Each object has its own (private) state 4. Every object is an instance of a class 5. An object s class determines the object s behavior How it handles method calls Class contains method definitions Java/C#/etc. similar but do not follow (1) (e.g., numbers, null) and allow objects to have non-private state 7 8 Defining classes and methods Creating and using an object class Name def method_name1 method_args1 expression1 def method_name2 method_args2 expression2 Define a class with methods as defined Method returns its last expression Ruby also has explicit return statement Syntax note: Line breaks often required (else need more syntax), but indentation always only style 9 ClassName.new creates a new object whose class is ClassName e.m evaluates e to an object and then calls its m method Also known as ss the m message Can also write e.m() Methods can take arguments, called like e.m(e1,,en) Parentheses optional in some places, but recommed 10 Variables Self Methods can use local variables Syntax: starts with letter Scope is method body No declaring them, just assign to them anywhere in method body (!) Variables are mutable, x=e Variables also allowed at top-level or in REPL Contents of variables are always references to objects because all values are objects self is a special keyword/variable in Ruby (Same as this in Java/C#/C++) Refers to the current object The object whose method is executing So call another method on same object with self.m() Syntactic sugar: can just write m() Also can pass/return/store the whole object with just self 11 12

Objects have state Aliasing An object s state persists Can grow and change from time object is created State only directly accessible from object s methods Can read, write, ext the state Effects persist for next method call Creating an object returns a reference to a new object Different state from every other object Variable assignment (e.g., x=y) creates an alias Aliasing means same object means same state State consists of instance variables (also known as fields) Syntax: starts with an @, e.g., @foo Spring into being with assignment So mis-spellings silently add new state (!) Using one not in state not an error; produces nil object 13 14 Initialization Class variables A method named initialize is special Is called on a new object before new returns Arguments to new are passed on to initialize Excellent for creating object invariants (Like constructors in Java/C#/etc.) Usually good style to create instance variables in initialize Just a convention Unlike OOP languages that make what fields an object has a (fixed) part of the class definition In Ruby, different instances of same class can have different instance variables There is also state shared by the entire class Shared by (and only accessible to) all instances of the class (Like Java static fields) Called class variables Syntax: starts with an @@, e.g., @@foo Less common, but sometimes useful And helps explain via contrast that each object has its own instance variables 15 16 Class constants and methods Class constants Syntax: start with capital letter, e.g., Foo Should not be mutated Visible outside class C as C::Foo (unlike class variables) Class methods (cf. Java/C# static methods) Syntax (in some class C): def self.method_name (args) Use (of class method in class C): C.method_name(args) Part of the class, not a particular instance of it 17 Who can access what We know hiding things is essential for modularity and abstraction OOP languages generally have various ways to hide (or not) instance variables, methods, classes, etc. Ruby is no exception Some basic Ruby rules here as an example 18

Object state is private In Ruby, object state is always private Only an object s methods can access its instance variables Not even another instance of the same class So can write @foo, but not e.@foo To make object-state publicly visible, define getters / setters Better/shorter style coming next def get_foo @foo def set_foo x @foo = x 19 Conventions and sugar Actually, for field @foo the convention is to name the methods def foo @foo def foo= x @foo = x Cute sugar: When using a method ing in =, can have space before the = e.foo = 42 Because defining getters/setters is so common, there is shorthand for it in class definitions Define just getters: attr_reader :foo, :bar, Define getters and setters: attr_accessor :foo, :bar, Despite sugar: getters/setters are just methods 20 Why private object state This is more OOP than public instance variables Can later change class implementation without changing clients Like we did with ML modules that hid representation And like we will soon do with subclasses Can have methods that seem like setters even if they are not def celsius_temp= x @kelvin_temp = x + 273.15 Method visibility Three visibilities for methods in Ruby: private: only available to object itself protected: available only to code in the class or subclasses public: available to all code Methods are public by default Multiple ways to change a method s visibility Here is one way Can have an unrelated class that implements the same methods and use it with same clients See later discussion of duck typing 21 22 Method visibilities One detail class Foo = # by default methods public protected # now methods will be protected until # next visibility keyword public If m is private, then you can only call it via m or m(args) As usual, this is shorthand for self.m But for private methods, only the shorthand is allowed private 23 24

Now (see the code) Pure OOP Put together much of what we have learned to define and use a small class for rational numbers Called MyRational because Ruby 1.9 has great built-in support for fractions using a class Rational Will also use several new and useful expression forms Ruby is too big to show everything; see the documentation Way our class works: Keeps fractions in reduced form with a positive denominator Like an ML-module example earlier in course Ruby is fully committed to OOP: Every value is a reference to an object Simpler, smaller semantics Can call methods on anything May just get a dynamic undefined method error Almost everything is a method call Example: 3 + 4 25 26 Some examples All code is methods Numbers have methods like +, abs, nonzero?, etc. nil is an object used as a nothing object Like null in Java/C#/C++ except it is an object Every object has a nil? method, where nil returns true for it Note: nil and false are false, everything else is true Strings also have a + method String concatenation Example: "hello" + 3.to_s All methods you define are part of a class Top-level methods (in file or REPL) just added to Object class Subclassing discussion coming later, but: Since all classes you define are subclasses of Object, all inherit the top-level methods So you can call these methods anywhere in the program Unless a class overrides (roughly-not-exactly, shadows) it by defining a method with the same name 27 28 Reflection and exploratory programming Changing classes All objects also have methods like: methods class Can use at run-time to query what an object can do and respond accordingly Called reflection Also useful in the REPL to explore what methods are available May be quicker than consulting full documentation Another example of just objects and method calls Ruby programs (or the REPL) can add/change/replace methods while a program is running Breaks abstractions and makes programs very difficult to analyze, but it does have plausible uses Simple example: Add a useful helper method to a class you did not define Controversial in large programs, but may be useful For us: Helps re-enforce the rules of OOP Every object has a class A class determines its instances behavior 29 30

Examples The moral Add a double method to our MyRational class Add a double method to the built-in FixNum class Defining top-level methods adds to the built-in Object class Or replaces methods Replace the + method in the built-in FixNum class Oops: watch irb crash Dynamic features cause interesting semantic questions Example: First create an instance of class C, e.g., x = C.new Now replace method method m in C Now call x.m Old method or new method? In Ruby, new method The point is Java/C#/C++ do not have to ask the question May allow more optimized method-call implementations as a result 31 32 Duck Typing If it walks like a duck and quacks like a duck, it's a duck Or don't worry that it may not be a duck When writing a method you might think, I need a Foo argument but really you need an object with enough methods similar to Foo's methods that your method works Embracing duck typing is always making method calls rather than assuming/testing the class of arguments Plus: More code reuse; very OOP approach What messages an object receive is all that matters Minus: Almost nothing is equivalent x+x versus x*2 versus 2*x Callers may assume a lot about how callees are implemented 33 Duck Typing Example def mirror_update pt pt.x = pt.x * (-1) Natural thought: Takes a Point object (definition not shown here), negates the x value Makes sense, though a Point instance method more OOP Closer: Takes anything with getter and setter methods for @x instance variable and multiplies the x field by -1 Closer: Takes anything with methods x= and x and calls x= with the result of multiplying result of x and -1 Duck typing: Takes anything with method x= and x where result of x has a * method that can take -1. Ss result of calling x the * message with -1 and ss that result to x= 34 With our example def mirror_update pt pt.x = pt.x * (-1) Plus: Maybe mirror_update is useful for classes we did not anticipate Minus: If someone does use (abuse?) duck typing here, then we cannot change the implementation of mirror_update For example, to - pt.x Better (?) example: Can pass this method a number, a string, or a MyRational def double x x + x 35