2

This is a job interview problem. I'm supposed to create a data structure for a time in seconds and milliseconds, then create two Time objects, and then write a function that can return the difference between the two Times. This is my code:

class Time def initialize (sec, milli_sec) @sec = sec @milli_sec = milli_sec end def difference(time_2) puts @sec.to_i*1000 + @milli_sec.to_i + time_2.@sec end end time_1 = Time.new('5','30') time_2 = Time.new('6','40') time_1.difference(time_2) 

This is the error:

syntax error, unexpected tIVAR, expecting '(' 

I am having a problem accessing the @sec, @milli_sec variables of time_2 passed as time_1.difference(time_2). I think that the syntax is [email protected]_i or time_2.#@sec.to_i, but those return errors. time_2.sec returns uninitialized time, even though it looks like it's been initialized. I would like to know the solution to this problem.

1
  • Why not convert and store int values during initialize? Commented Jun 23, 2015 at 2:42

4 Answers 4

4

@sec and @milli_sec are instance variables of your Time class. This means that unless you do something else only the instance itself has access to them. Other parts of your code can create an instance, but are only able to access the methods you specify. The point of this is so that you can change the underlying implementation without affecting other parts of your code that are using this class.

There are a variety of ways to do this. You could define the following two methods in your Time class:

def sec @sec end def milli_sec @milli_sec end 

These methods are public (by default) so you can now do this:

t = Time.new(1, 2) puts t.sec # prints 1 puts t.milli_sec # prints 2 

A more Ruby-ish way would be to add this line to the top of your class:

attr_reader :sec, :milli_sec 

Doing this accomplishes the same thing as defining the two methods above. You might also want to look at attr_accessor.

P.S. Time is a poor choice of class name for your own code as it's already defined by Ruby itself.

Sign up to request clarification or add additional context in comments.

3 Comments

YOU beat me by seconds :( I wrote exactly the same thing. Grrrrrrr
Thank you Phillip, I was able to get it working by adding the two methods... but wasn't able to do it using: attr_reader :sec, :milli_sec ... I suppose that line would go above initialize? Is there ny other changes I would need to make (like remove the @ character or use the : character)?? Thank you!
@KameronWhite See gist.github.com/phallstrom/b6d593ebc39c6d66715d. Especially lines 2 and end of line 10.
1

In ruby, every interface is a group of methods. You can't just obj.@var to access instance variables since they are not methods thus not interfaces. If you want to expose instance variables, then create public methods to access them. attr_reader and attr_accessor are simply handy ways to create those methods.

Comments

0

Here is my final solution:

class Moment def initialize (sec, milli_sec) @sec = sec @milli_sec = milli_sec end def sec @sec end def milli_sec @milli_sec end def difference(time_2) return ((@sec.to_i*1000 + @milli_sec.to_i) - (time_2.sec.to_i*1000 + time_2.milli_sec.to_i)).abs end end time_1 = Moment.new('1','300') time_2 = Moment.new('11','20') time_1.difference(time_2) 

Comments

0
The same objective can be achieved in much lesser lines of code using approach as below:- class MyTime attr_accessor :seconds, :milli_seconds def initialize(entity={}) @seconds = entity['seconds'] @milli_seconds = entity['milli_seconds'] end def difference(obj) ms= ((@seconds.to_i*1000+@milli_seconds.to_i)-(obj.seconds.to_i*1000+obj.milli_seconds.to_i)) secs = ms/1000 msecs = ms%1000 return MyTime.new({'seconds'=> secs, 'milli_seconds'=> msecs}) end end time_1 = MyTime.new({'seconds'=> '20', 'milli_seconds'=> '100'}) time_2 = MyTime.new({'seconds'=> '10',`enter code here` 'milli_seconds'=> '20'}) diff_Obj = time_1.difference(time_2) puts "Difference is : #{diff_Obj.seconds} Seconds #{diff_Obj.milli_seconds} milliseconds" 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.