What did I learn?
Ruby is starting to look quite like python. Duck typing can catch you out : a regex pattern looks like a sting, quacks like a string, but doesn't waddle like a string. Ruby has nicked some of Perls' pattern-matching syntax, which is a good thing as it's great for rule-based input processing.
Exercise : Can we translate a hash to an array, and can we iterate over a hash?
Well, yes we can :
#!/usr/bin/ruby
numbers = {1=>'one', 2=> 'two', 3=>'three', 4 => 'four'}
num_array = []
numbers.each do |num, str|
num_array.push([num,str])
end
p 'My class is ' + num_array.class.to_s
p 'Element class is ' + num_array[0].class.to_s
puts num_array
Of course we could have just used numbers.flatten()
#!/usr/bin/ruby
=begin
This exercise is to print the numbers 1 to 16 in groups of 4
=end
#Old school
i = 0
ary = []
(1..16).each do |num|
if i % 4 == 0
if i > 0
p ary
end
ary = []
end
ary.push(num)
i = i + 1
end
p ary
# One liner -using a code block
(1..16).each_slice(4) {|ary| p ary}
Exercise 3 : Populate the Tree class from a hash.
I'm not going to put all the code up for this, and I struggled a bit to get it going. The solution that I settled on was to have two classes, a Tree class that took the hash argument which extended a Node class that was the basic structure.
The Node initializer looks like this :
def initialize(name, node = {})
@children = []
@node_name = name
node.each { |key,child| @children.push(Node.new(key,child)) }
end
So it just build the tree recursively.
Exercise 4 implement grep
=begin
Grep implementation, matches a string against lines from a file,
outputs the line number and contents of the matched line
usage : rb_grep pattern file
=end
i = 1
File.open(ARGV[1],"r") do |f|
pattern = Regexp.new(ARGV[0])
while line = f.gets
line =~ pattern and printf("%d : %s", i,line)
i = i + 1
end
end
No comments:
Post a Comment