Question: ```
class A
   def test
       "Test from instance"
   end
   class << self
       def test
           "Test from class"
       end
    end
end

p A.send(:test)    # "Test from class"
p A.new.method(:test).call  # "Test from instance"

```

Here symbol works as expected, but here:

```
s="test"
s1=:s
p s1   # :s

```

why **:s** is printed here?? I dont understand the reason behind it.
Can anyone please explain for me ?

Answer: 
Symbols are sort of lightweight strings (though they are not strings). The `send()` and `method()` methods can take strings or symbols; one is converted to the other in the inner workings (not sure which) and then ruby executes the method with the matching name. Hence `A.send(:text)` is equivalent to `A.text()`. If you had a variable named `methodName = :text`, you could do `A.send(methodName)` but not `A.methodName()`.

Symbols are not variables, so you can't assign a value to a symbol. In your example, the symbol `:s` is unrelated to the variable `s` (despite the fact that they have the same "name", preceding it with a colon makes it a symbol instead of a variable). You're assigning a string value to the variable `s` but telling it to print the symbol `:s`, which it does.
You set the value of s1 to be :s, so why would you expect it to return anything different?

If you look at the ruby API for the Object class, you will see both [Object#send](http://ruby-doc.org/core-1.9.3/Object.html#method-i-send) and [Object#method](http://ruby-doc.org/core-1.9.3/Object.html#method-i-method) take a symbol as a parameter, so the top example is also totally expected.