tags:

views:

78

answers:

4

If both a method and a variable has the same name it will use the variable.

hello = "hello from variable"

def hello
  "hello from method"
end

puts hello

Is it possible somehow to use the method instead without changing name?

+2  A: 

Try this:

puts hello()
Nakilon
Right, but please elaborate on why using the parentheses make this work
Zabba
Because you are explicitly calling a method. Better to just, you know, use different names in the first place...
Ed Swangren
+2  A: 
puts self.hello

By the way, I agree with Henrik P. Hessel. This is a very horrible piece of code.

Simone Carletti
+2  A: 

The ambiguity between local variables and methods only arises for receiverless message sends with no argument list. So, the solution is obvious: either provide a receiver or an argument list:

self.hello
hello()

See also

Jörg W Mittag
Perfect answer.
Zabba
+1  A: 

This is more of a comment than an answer, but distinguishing between local variables and methods is vital if you're using an assignment method.

class TrafficLight
  attr_accessor :color

  def progress_color
    case color
    when :orange
      #Don't do this!
      color = :red
    when :green
      #Do this instead!
      self.color = :orange
    else
      raise NotImplementedError, "What should be done if color is already :red? Check with the domain expert, and build a unit test"
    end
  end
end

traffic_light = TrafficLight.new
traffic_light.color = :green
traffic_light.progress_color
traffic_light.color # Now orange
traffic_light.progress_color
traffic_light.color # Still orange
Andrew Grimm