这就是我现在得到的——对于它正在做的工作来说,这看起来太啰嗦了。

@title        = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?

假设token是通过分割CSV行获得的数组。 现在的功能像脱衣!chomp !如果字符串未被修改,则返回nil

"abc".strip!    # => nil
" abc ".strip!  # => "abc"

如果它包含额外的前导空格或尾随空格,Ruby如何在不创建副本的情况下对其进行修剪?

如果我想要做令牌[Title].chomp!.strip!


当前回答

如果你想使用另一种方法,你需要这样的东西:

( str.strip || str ).split(',')

这样你就可以脱光衣服,之后还能做点什么:)

其他回答

顺便说一下,现在红宝石已经支持只是剥离没有“!”

比较:

p "abc".strip! == " abc ".strip!  # false, because "abc".strip! will return nil
p "abc".strip == " abc ".strip    # true

而且,没有副本是不可能脱衣的。参见string.c中的源代码:

static VALUE
rb_str_strip(VALUE str)
{
    str = rb_str_dup(str);
    rb_str_strip_bang(str);
    return str;
}

Ruby 1.9.3p0 (2011-10-30) [i386-mingw32]

更新1: 就像我现在看到的,它是在1999年创建的(参见SVN中的rev #372):

更新2: 带!不会在1.9中创建副本。x, 2。X和trunk版本。

@title = tokens[Title].strip! || tokens[Title]

我完全有可能听不懂这个话题,但这不正是你所需要的吗?

" success ".strip! || "rescue" #=> "success"
"failure".strip! || "rescue" #=> "rescue"

我认为你的例子是一个明智的方法,尽管你可以稍微简化一下:

@title = tokens[Title].strip! || tokens[Title] if tokens[Title]

或者你可以把它放在两行:

@title = tokens[Title] || ''
@title.strip!

我猜你想要的是:

@title = tokens[Title]
@title.strip!

#地带!如果没有剥离任何内容,方法将返回nil,如果已剥离,则返回变量本身。

根据Ruby标准,带有感叹号后缀的方法会就地更改变量。

更新:这是从irb输出演示:

>> @title = "abc"
=> "abc"
>> @title.strip!
=> nil
>> @title
=> "abc"
>> @title = " abc "
=> " abc "
>> @title.strip!
=> "abc"
>> @title
=> "abc"

如果你想使用另一种方法,你需要这样的东西:

( str.strip || str ).split(',')

这样你就可以脱光衣服,之后还能做点什么:)