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