Ruby';唐卡斯!行为

Ruby';唐卡斯!行为,ruby,Ruby,我是ruby新手,正在做一些基本的字符串操作来掌握它的窍门,我注意到foo='foo'。downcase与将vale分配给foo后的下套管不同,如下所示: foo = 'foo'.downcase! if foo.include? 'foo' print 'bar' end 这将导致为nil:NilClass(NoMethodError)生成一个NoMethodError:未定义的方法'include' 赋值后下套管foo时,不会: foo = 'foo' foo.downcase!

我是ruby新手,正在做一些基本的字符串操作来掌握它的窍门,我注意到
foo='foo'。downcase与将vale分配给
foo
后的下套管不同,如下所示:

foo = 'foo'.downcase!
if foo.include? 'foo'
    print 'bar'
end
这将导致为nil:NilClass(NoMethodError)生成一个
NoMethodError
未定义的方法'include'

赋值后下套管foo时,不会:

foo = 'foo'
foo.downcase!
if foo.include? 'foo'
    print 'bar'
end
如果这是一个无关紧要的问题,我很抱歉,但几分钟的谷歌搜索并没有带来任何成果。

如果无法对接收方字符串对象进行更改,则返回
nil
。这就是为什么
foo='foo'。唐卡斯
导致局部变量
foo
被关联为
nil
。因为
foo
字符串的大小写已设置为空

这就是为什么
如果foo.include?”foo'
变为
如果为nil.include?“foo'
。正如我们所知,
Nilclass\include?
不存在,因此您得到了错误

但如果无法进行更改,则返回接收方本身;如果可以进行更改,则返回已更改的新字符串对象

在以下示例中:

downcase
method返回
nil
(原因如我在第一段中提到的),但由于您在调用该方法时没有执行局部变量赋值(这是第一个示例的情况),因此
foo
仍然保持原始对象
'foo'

foo = 'foo'
foo.downcase!
这就是为什么
如果foo.include?“foo'
变成
如果是“foo”。是否包括?“foo”
。但是您在
'foo'
上调用
#include?
字符串的实例,并且
String#include?
方法存在,因此不会出现错误。

这是因为它是一种破坏性方法(因此!),意味着它在适当的位置对对象进行操作。因为它改变了对象本身,所以不需要它的返回值。Ruby设计者认为,返回值的一个好用途是指示是否进行了任何更改

下调str的内容,如果没有更改,则返回nil


您的字符串已经是小写的,所以
downcase
返回
nil
,然后用它替换变量。

由于该位,您会看到这种行为:

'foo'.downcase!
downcase
方法是一个就地替换,这意味着它只影响调用它的对象。它仅在字符串更改时返回结果。例如

foo = 'foo'.downcase!    # foo == NilClass, because 'foo' is already lower-case.
bar = 'BAR'.downcase!    # bar == String, because 'BAR' was changed to 'bar'
如果您需要在执行downcase后保证
foo
是字符串,则可以使用非侵入性
downcase
方法(注意缺少的感叹号)

上述代码应始终有效。通常情况下,将字符串作为不可变的来处理是一个好主意,而不是使用侵入式方法,因为这样可以大大简化代码,避免类似这样的错误

foo = 'foo'.downcase
if foo.include? 'foo'
    print 'bar'
end