在不创建新字符串的情况下修剪Ruby中的字符串的规范方法是什么?

Gis*_*shu 178 ruby string

这就是我现在所拥有的 - 它对于它所做的工作看起来过于冗长.

@title        = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?
Run Code Online (Sandbox Code Playgroud)

假设标记是通过分割CSV线获得的数组.现在像条带的功能!的Chomp!等.如果字符串未被修改,则返回nil

"abc".strip!    # => nil
" abc ".strip!  # => "abc"
Run Code Online (Sandbox Code Playgroud)

如果Ruby包含额外的前导或尾随空格而不创建副本,那么Ruby的方法是什么?

如果我想做的话会变得更加丑陋 tokens[Title].chomp!.strip!

Igo*_*gor 263

我想你想要的是:

@title = tokens[Title]
@title.strip!
Run Code Online (Sandbox Code Playgroud)

如果它没有剥离任何东西,该#strip!方法将返回nil,如果它被剥离,则返回变量本身.

根据Ruby标准,带有感叹号的方法会将变量更改到位.

希望这可以帮助.

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

>> @title = "abc"
=> "abc"
>> @title.strip!
=> nil
>> @title
=> "abc"
>> @title = " abc "
=> " abc "
>> @title.strip!
=> "abc"
>> @title
=> "abc"
Run Code Online (Sandbox Code Playgroud)

  • 为什么在世界上它会返回"nil",除非它剥离了什么东西?毫无疑问,这让很多人感到困惑(因为它毫无意义). (15认同)
  • Ruby 1.9有tap,它完全符合你的要求:@ title.tap {| x | x.strip!} (9认同)
  • 好吧,@ title = tokens [Title] .strip会做的伎俩,但你有一个副本,如果你保持令牌[Title]变量不变,这很好. (6认同)
  • @timkay可以做`@title.tap&:strip!`?这似乎比其他任何东西更清洁. (2认同)

gaR*_*Rex 51

顺便说一句,现在红宝石已经支持只有条带没有"!".

相比:

p "abc".strip! == " abc ".strip!  # false, because "abc".strip! will return nil
p "abc".strip == " abc ".strip    # true
Run Code Online (Sandbox Code Playgroud)

如果strip没有重复,也是不可能的.请参阅string.c中的源代码:

static VALUE
rb_str_strip(VALUE str)
{
    str = rb_str_dup(str);
    rb_str_strip_bang(str);
    return str;
}
Run Code Online (Sandbox Code Playgroud)

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

更新1:正如我现在看到的 - 它创建于1999年(参见SVN中的rev#372):

Update2: strip!不会创建重复项 - 包括1.9.x,2.x和trunk版本.


小智 9

除了你已经更改了默认记录分隔符并且这就是你正在咀嚼的东西之外,不需要同时剥离和删除条带也会删除尾随回车.

Olly的答案已经有了在Ruby中执行此操作的规范方法,但如果您发现自己这么做很多,那么您总是可以为它定义一个方法:

def strip_or_self!(str)
  str.strip! || str
end
Run Code Online (Sandbox Code Playgroud)

赠送:

@title = strip_or_self!(tokens[Title]) if tokens[Title]
Run Code Online (Sandbox Code Playgroud)

还要记住,如果@title令牌为nil,if语句将阻止被分配,这将导致它保持其先前的值.如果您想要或不介意@title始终被分配,您可以将检查移动到方法中并进一步减少重复:

def strip_or_self!(str)
  str.strip! || str if str
end
Run Code Online (Sandbox Code Playgroud)

作为替代方案,如果您有冒险精神,可以在String上定义一个方法:

class String
  def strip_or_self!
    strip! || self
  end
end
Run Code Online (Sandbox Code Playgroud)

给出以下之一:

@title = tokens[Title].strip_or_self! if tokens[Title]

@title = tokens[Title] && tokens[Title].strip_or_self!
Run Code Online (Sandbox Code Playgroud)


gat*_*ues 9

如果您使用的是Ruby on Rails,则会出现挤压

> @title = " abc "
 => " abc " 

> @title.squish
 => "abc"
> @title
 => " abc "

> @title.squish!
 => "abc"
> @title
 => "abc" 
Run Code Online (Sandbox Code Playgroud)

如果你只使用Ruby,你想使用strip

这里有陷阱..在你的情况下,你想使用条带没有爆炸!

剥离!肯定会返回零,如果没有动作它仍然更新变量所以剥离!不能用于内联.如果你想使用条带内联你可以使用没有爆炸的版本!

跳闸!使用多线方法

> tokens["Title"] = " abc "
 => " abc "
> tokens["Title"].strip!
 => "abc"
> @title = tokens["Title"]
 => "abc"
Run Code Online (Sandbox Code Playgroud)

剥离单线方法...你的答案

> tokens["Title"] = " abc "
 => " abc "
> @title = tokens["Title"].strip if tokens["Title"].present?
 => "abc"
Run Code Online (Sandbox Code Playgroud)


Dio*_*aru 5

如果您想在需要类似的内容后使用另一种方法:

( str.strip || str ).split(',')
Run Code Online (Sandbox Code Playgroud)

这样你就可以脱掉衣服,然后仍然可以做一些事情:)