Forum: Ruby Why eval is not failing in the third case ( c3)

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Raj S. (Guest)
on 2009-01-18 23:36
>> c1 = 'hello'
>> eval c1
NameError: undefined local variable or method `hello' for main:Object

>> c2 = 'hello #{hi}'
=> "hello \#{hi}"
>> eval c2
NameError: undefined local variable or method `hello' for main:Object

>> c3 = '#{hi} hello'
=> "\#{hi} hello"
>> eval c3
=> nil


My question is why the eval of c3 is returning nil. It should fail
saying that undefined local variable just as it did in the case of c2 ?
Time W. (Guest)
on 2009-01-18 23:58
(Received via mailing list)
2009/1/18 Raj S. <removed_email_address@domain.invalid>

> => "\#{hi} hello"
> >> eval c3
> => nil
>
>
> My question is why the eval of c3 is returning nil. It should fail
> saying that undefined local variable just as it did in the case of c2 ?


It's evaluated as a comment:
#hi hello
If you want #{hi} to be replaced by the content of the variable hi, you
should use double quotes:
c4 = "#{hi} hello"
Ken B. (Guest)
on 2009-01-19 02:42
(Received via mailing list)
On Sun, 18 Jan 2009 16:35:31 -0500, Raj S. wrote:

> => "\#{hi} hello"
>>> eval c3
> => nil
>
>
> My question is why the eval of c3 is returning nil. It should fail
> saying that undefined local variable just as it did in the case of c2 ?

In the second and third cases, everything after (and including) the # is
interpreted as a comment. Thus, you're executing

hello
hello #{hi}
#{hi} hello

In case 1, hello is a undefined method, so a NameError is raised
In case 2, hello comes before the comment, so it gets executed (with no
arguments). A NameError is raised because it's an undefined method.
In case 3, hello is part of the comment. Nothing gets executed, so no
NameError is raised.
This topic is locked and can not be replied to.