Ruby Cookbook
Total Page:16
File Type:pdf, Size:1020Kb
Ruby Cookbook Lucas Carlson and Leonard Richardson O'REILLY' Beijing • Cambridge • Farnham • Köln • Paris • Sebastopol • Taipei • Tokyo Tableof Contents Preface xix 1. Strings 1 1.1 Building a String from Parts 4 1.2 Substituting Variables into Strings 6 1.3 Substituting Variables into an Existing String 8 1.4 Reversing a String by Words or Characters 10 1.5 Representing Unprintable Characters 11 1.6 Converting Between Characters and Values 14 1.7 Converting Between Strings and Symbols 14 1.8 Processing a String One Character at a Time 16 1.9 Processing a String One Word at a Time 17 1.10 Changing the Case of a String 19 1.11 Managing Whitespace 21 L12 Testing Whether an Object Is String-Like 22 1.13 Getting the Partsofa String YouWant 23 1.14 Handling International Encodings 24 1.15 Word-Wrapping Lines of Text 26 1.16 Generating aSuccession of Strings 28 1.17 Matching Strings with Regulär Expressions 30 1.18 Replacing Multiple Patterns in a Single Pass 32 1.19 Validating an Email Address 33 1.20 Classifying Text with a Bayesian Analyzer 37 2. Numbers ..... 39 2.1 Parsing a Number from a String 40 2.2 Comparing Floating-Point Numbers 43 2.3 Representing Numbers to Arbitrary Precision 45 2.4 Representing Rational Numbers . 48 2.5 Generating Random Numbers 50 2.6 Converting Between Numeric Bases 52 2.7 Taking Logarithms 53 2.8 Finding Mean, Mediän, and Mode 55 2.9 Converting Between Degrees and Radians 58 2.10 Multiplying Matrices 60 2.11 Solving a System of Linear Equations 64 2.12 Using Complex Numbers 67 2.13 Simulating a Subclass of Fixnum 69 2.14 Doing Math with Roman Numbers 73 2.15 Generating a Sequerice of Numbers 78 2.16 Generating Prime Numbers ..• :81 2.17 Checking a Credit Card Checksum . 85 3. Date and Time 87 3.1 Finding Today's Date ' 90 3.2 Parsing Dates, Precisely or Fuzzily 93 3.3 Printing a Date 96 3.4 Iterating Over Dates 100 3.5 Doing Date Arithmetic 102 3.6 Counting the Days Since an Arbitrary Date 104 3.7 Converting Between Time Zones 106 3.8 Checking Whether Daylight Saving Time Is in Effect 109 3.9 Converting Between Time and DateTime Objects 110 3.10 Finding the Day of the Week 113 3.11 Handling Commercial D ates 115 3.12 Running a Code Block Periodically 116 3.13 Waiting a Certain Amount of Time 118 3.14 Adding a Timeout to a Long-Running Operation 121 4. Arrays 123 4.1 Iterating Over an Array 125 4.2 Rearranging Values Without Using Temporary Variables 129 4.3 Stripping Duplicate Elements from an Array 130 4.4 Reversing an Array . 132 4.5 Sorting an Array 132 4.6 Ignoring Case When Sorting Strings 134 viii I Tableof Contents 4.7 Making Sure a Sorted Array Stays Sorted 135 4.8 Summing the Items of an Array 140 4.9 Sorting an Array by Frequency of Appearance 141 4.10 Shuffling an Array 143 4.11 Getting the N Smallest Items of an Array 145 - 4.12 Building Up a Hash Using Injection 147 4.13 Extracting Portions of Arrays 149 4.14 Computing Set Operations on Arrays 152 4.15 Partitioning or Classifying a Set 155 5. Hashes ... 159 5.1 Using Symbols as Hash Keys 161 5.2 Creating a Hash with a Default Value 162 5.3 Adding Elements to a Hash 164 5.4 Removing Elements from a Hash 166 5.5 Using an Array or Other Modifiable Object as a Hash Key 168 5.6 Keeping Multiple Values for the Same Hash Key 170 5.7 Iterating Over a Hash 171 5.8 Iterating Over a Hash in Insertion Order 174 5.9 Printing a Hash 175 5.10 Invertmg a Hash . 177 5.11 Choosing Randomly from a Weighted List 179 5.12 Building a Histogram 181 5.13 Remapping the Keys and Values of a Hash 183 5.14 Extracting Portions of Hashes 184 5.15 Searching a Hash with Regulär Expressions 185 6. Files and Directories 187 6.1 Checking to See If a File Exists . 190 6.2 Checking Your Access to a File 191 6.3 Changing the Permissions on a File 193 6.4 Seeing When a File Was Last Used 196 6.5 Listing a Directory 198 6.6 Reading the Contents of a File 201 6.7 Writing to a File ' 204 6.8 Writing to a Temporary File 206 6.9 Picking a Random Line from ä File 207 6.10 Comparing Two Files 209 6.11 Performing Random Access ori "Reäd-Once" Input Streams 212 Tahlpnffnntpnt«; I 6.12 Walking a Directory Tree 214 6.13 Lockinga File 217 6.14 Backing Up to Versioned Filenames 220 6.15 Pretending a String Is a File 222 6.16 Redirecting Standard Input or Output , 225 6.17 Processing a Binary File 227 6.18 Deletinga File • 231 6.19 Truhcatinga File 232 6.20 Finding the Files You Want 233 6.21 Finding and Changing the Current Working Directory 235 7. Code Blocks and Iteration 237 7.1 Creating and Invoking a Block .. 240 7.2 Writing a Method That Accepts a Block 241 7.3 Binding a Block Argument to a Variable . 244 7.4 Blocks as Closures: Using Outside Variables Within a Code Block 246 7.5 Writing an Iterator Over a Data Structure 247 7.6 Changing the Way an Object Iterates 250 7.7 Writing Block Methods That Classify or Collect 253 7.8 Stopping an Iteration 254 7.9 Looping Through Multiple Iterables in Parallel 256 7.10 Hiding Setup and Cleanup in a Block Method 260 7.11 Coupling Systems Loosely with Callbacks 262 8. Objects and Classes 267 8.1 Managing Instance Data 269 8.2 Managing Class Data 272 8.3 Checking Class or Module Membership 275 8.4 Writing an Inherited Class 277 8.5 Overloading Methods 279 8.6 Validating and Modifying Attribute Values 281 8.7 Defining a Virtual Attribute . 283 8.8 Delegating Method Calls to Another Object 284 8.9 Converting and Coercing Objects to Different Types 287 8.10 Getting a Hüman-Readable Printout of Any Object 291 8.11 Accepting or Passing a Variable Number of Arguments 293 8.12 Simulating Keyword Arguments . 295 8.13 Calling a Superclass's Method 297 8.14 Creating an Abstract Method 299 x I Tafale of Contents 8.15 Freezing an Object to Prevent Changes 302 8.16 Making a Copy of an Object 304 8.17 Declaring Constants 307 8.18 Implementing Class and Singleton Methods 309 8.19 Controlling Access by Making Methods Private 311 9. Modulesand Namespaces ., 315 9.1 Simulating Multiple Inheritance with Mixins 315 9.2 Extending Specific Objects with Modules 319 9.3 Mixing in Class Methods 321 9.4 Implementing Enumerable: Write One Method, Get 22 Free 322 9.5 Avoiding Naming Collisions with Namespaces 324 9.6 Automatically Loading Libraries as Needed 326 9.7 Including Namespaces 328 9.8 Initializing Instance Variables Defined by a Module 329 9.9 Automatically Initializing Mixed-In Modules 330 10. Reflection and Metaprogramming 333 10.1 Finding an Object's Class and Superclass . 334 10.2 Listing an Object's Methods 335 10.3 Listing Methods Unique to an Object 337 10.4 Getting a Reference to a Method 339 10.5 Fixing Bugs in Someone Else's Class 341 10.6 Listening for Changes to a Class 343 10.7 Checking Whether an Object Has Necessary Attributes 345 10.8 Responding to Calls to Undefined Methods 347 10.9 Automatically Initializing Instance Variables 351 10.10 Avoiding Boilerplate Code with Metaprogramming 352 10.11 Metaprogramming with String Evaluations 355 10.12 Evaluating Code in an Earlier Context 357 10.13 Undefining a Method 358 10.14 Aliasing Methods . 361 10.15 Doing Aspect-Oriented Programming 364 10.16 Enforcing Software Contracts 367 11. XML and HTML 371 11.1 Checking XML Well-Formedness 372 11.2 Extracting Data from a Document's Tree Structure 374 11.3 Extracting Data While Parsing a Document 376 Tahlertf fnntantt I vi 11.4 Navigating a Document with XPath 377 11.5 Parsing Invalid Markup 380 11.6 Converting an XML Document into a Hash 382 11.7 Validatirig an XML Document 385 11.8 Substituting XML Entities 388 11.9 Creating and Modifying XML Documents 390 11.10 Compressing Whitespace in an XML Document 394 11.11 Guessing a Document's Encoding 395 11.12 Converting from One Encoding to Another 396 11.13 Extracting All the URLs from an HTML Document 398 11.14 Transforming Piain Text to HTML 401 11.15 Converting HTML Documents from the Web into Text 402 11.16 A Simple Feed Aggregator 405 12. Graphics and Other File Formats 409 12.1 Thumbnailing Images 409 12.2 Adding Text to an Image , 412 12.3 Converting One Image Format to Another 415 12.4 GraphingData 417 12.5 Adding Graphical Context with Sparklines 421 12.6 Strongly Encrypting Data 424 12.7 Parsing Comma-Separated Data 426 12.8 Parsing Not-Quite-Comma-Separated Data 429 12.9 Generating and Parsing Excel Spreadsheets 431 12.10 Compressing and Archiving Files with Gzip and Tar 433 12.11 Reading and Writing ZIP Files 436 12.12 Reading and Writing Configuration Files 437 12.13 Generating PDF Files 439 12.14 Representing Data as MIDI Music 443 13.