Mercurial > repos > other > SevenLanguagesInSevenWeeks
view 1-Ruby/day2.rb @ 19:ddcd809319ac
Add first two Day 2 exercises
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Wed, 04 Jan 2017 21:01:13 +0000 |
parents | |
children | 25c15f27b33d |
line wrap: on
line source
#! /usr/bin/env ruby ## File handling with a block name = 'day2.txt' def print_file(name) File.open(name, 'r') do |file| puts name while line = file.gets puts " #{line}" end end end File.open(name, 'w') do |file| file.puts "File contents go here" end print_file(name) File.open(name, 'r+') do |file| # If we don't seek then we override file.seek(0, IO::SEEK_END) file.puts 'Extra content here' end print_file(name) File.delete(name) puts "File still exists!" if File.exists?(name) # Old-skool Java style without passing a code block my_file = File.open(name, 'w') my_file.puts 'Non-block file content' my_file.close() #Note: Close the file manually! print_file(name) File.delete(name) ## Converting a hash into an array my_hash = { 'a' => 'one', 'b' => 'two', 'c' => 'three' } puts my_hash.inspect # "{}.methods" includes "to_a" method - appears to convert to an array. puts my_hash.to_a.inspect # However, it includes keys *and* values (as nested arrays, according to http://apidock.com/ruby/Hash/to_a). # There's also ":keys" and ":values" puts my_hash.keys.inspect puts my_hash.values.inspect # Alternatively, :collect runs over all key-value pairs as an array, so we can do: puts my_hash.collect { |val| val[1] }.inspect ## Converting an array to a hash # Arrays have a :to_h method, but that assumes nested arrays of key-value pairs, # e.g. [[key1, value1], [key2, value2]] # Looping to create a nested array structure then :to_h would work: my_array = ['one', 'two', 'three'] temp = [] # This would be neater with :map or :collect but then we don't get the index. # The only sensible option is an :each_with_index, but that negates the need # for :to_h. my_hash = {} my_array.each_with_index do |val, idx| my_hash[idx] = val end puts my_hash.inspect