Hi,
How can I overwrite a class variable? What I have here is a class
called Machine which calculates how many times a rectngle fits in a 60 x
120 rectangular shape and its working, in the code below it could fit 36
times, the problems is that I’m going to have differnet methods which
are supose to overwrite @@kerf and make the calculation based on these
new values but I do not know how to overwrite the class variable @@kerf.
How can I overwrite variable @@kerf so that when I call method "laser
(machine1.laser) the result would be 6 instead of 36 and when the method
“rurret” (machine1.turret) is called the result would be 12 instead of
36?
class Machine
@@kerf = 0
def initialize(prt_w, prt_l)
part_width = prt_w + @@kerf
part_length = prt_l + @@kerf
sheet_width = 60
sheet_length = 120
parts_y = sheet_width / part_width
parts_x = sheet_length / part_length
@total = parts_y * parts_x
end
def laser
@@kerf = 20
puts “#{@total.floor}”
end
def turret
@@kerf = 10
puts “#{@total.floor}”
end
end
machine1 = Machine.new(10 , 20)
machine1.laser
machine1.turret
Sorry if my code doesnt make any sense but I’m practicing.
Thanks a lot for your help!
To be honest you do not need class variables for this and you should
not do the calculation in the initialize method as you do not know
what value to use for kerf. This is a better solution.
class Machine
def initialize(part_width, part_length)
@part_width = part_width
@part_length = part_length
end
def laser
puts calc(20)
end
def turret
puts calc(10)
end
private
def calc(kerf)
sheet_width = 60
sheet_length = 120
parts_y = sheet_width / (@part_width + kerf)
parts_x = sheet_length / (@part_length + kerf)
return parts_y * parts_x
end
end
machine1 = Machine.new(10 , 20)
machine1.laser
machine1.turret
Wow! I knew someone would come with a better solution. Awesome!
I’m not trying to improve your code I’m just trying to practice by
overwriting variables (in this case an instance variable not a class
variable).
class Machine
def initialize(part_width, part_length)
@part_width = part_width
@part_length = part_length
end
def laser
@kerf = 20
calc
end
def turret
@kerf = 10
calc
end
private
def calc
sheet_width = 60
sheet_length = 120
parts_y = sheet_width / (@part_width + @kerf)
parts_x = sheet_length / (@part_length + @kerf)
puts parts_y * parts_x
end
end
machine1 = Machine.new(10 , 20)
machine1.laser
machine1.turret
This makes me feel good and bad, good because its increible to see
people helping others and whats best see people that identify the
problem in a metter of seconds (you guys are awesome) and bad becuase I
could’t figure this out by my self 
Thanks a lot
Marc H. wrote in post #1031087:
You just need to write more ruby code.
Ideally, write small classes that solve a given problem,
then re-use those classes to make a larger project.
Do you know of any tutorials where you can actually practice Ruby in
actual projects? Not tutorials on the Ruby syntax (projects using Ruby)
I have another question, in Peters code he used “private” but if I
remove it, it actually works can someone explain the use of private
here, is this the way of making a private def in Ruby? Meaning that this
def will not be accessible outside the class.
private
def calc
sheet_width = 60
sheet_length = 120
parts_y = sheet_width / (@part_width + @kerf)
parts_x = sheet_length / (@part_length + @kerf)
puts parts_y * parts_x
end
There are two ways (maybe more) to define methods as private.
-
class C
private # every method following will be private
def m1 … end
def m2 … end
end
-
class C
def m1 … end
def m2 … end
private :m1, :m2
end
In both cases, m1 and m2 would be private.
Of course, in Ruby nothing is fixed. You can make private methods public
again if you really want to.
-Jingjing
bad because I could’t figure this out by my self
You just need to write more ruby code.
Ideally, write small classes that solve a given problem,
then re-use those classes to make a larger project.
On Nov 9, 2011, at 5:29 PM, Fily S. wrote:
I have another question, in Peters code he used “private” but if I
remove it, it actually works can someone explain the use of private
here, is this the way of making a private def in Ruby?
You make methods private if you don’t want to expose them on the
object’s public API. Note that because of Ruby’s dynamic nature,
‘private’ does not mean that you can’t call the method from the
outside, it just discourages it. Ruby enforces that private methods can
only be called without an explicit receiver, i.e., you can not call it
with a dot directly in front of it. If ‘calc’ is a private method of
Class A, then you cannot do this:
A.new.calc # => fails
However, inside of an instance of A, you can call calc without
specifying a receiver (because self will be used implicitly). If you
still want to call a private method from the outside, the common way is
to use #send. Therefore, you could do this:
A.new.send(:calc)
Typically, you will make methods private if you don’t intend them to be
called from the outside. Use them to express your intentions more
clearly and help others (or your future self) to understand your code
better.
Thank you all very much for the good information!