为什么Ruby中没有`.split!`?

时间:2016-09-12 02:52:51

标签: ruby

当有downcase!时,拥有它似乎很合乎逻辑。有没有其他人在Ruby中遇到过这个用例?

对于好奇的人,我正在尝试这样做:

def some_method(foo)
  foo.downcase!.split!(" ")
## do some stuff with foo later. ##
end

some_method("A String like any other")

而不是:

 def some_method(foo)
   foo = foo.downcase.split(" ")
 ## do some stuff with foo later. ##
 end

 some_method("A String like any other")

这不是什么大问题......但是!看起来更酷。

5 个答案:

答案 0 :(得分:3)

  

为什么Ruby中没有.split!

     

只要有downcase!,就可以获得它。

这可能是合乎逻辑的,但这是不可能的:对象不能在Ruby中改变他们的类或他们的身份。您可能会想到Smalltalk的become:并没有 不能存在于Ruby中。 become:更改了对象的标识,因此也可以更改其类。

答案 1 :(得分:1)

我不认为这个“用例”非常重要。

“爆炸方法”唯一能做的就是省去分配变量的麻烦。

“爆炸方法”是一个例外,而不是规则是因为如果你不理解它们会产生令人困惑的结果。

即。如果你写

a = "string"
def my_upcase(string)
  string.upcase!
end
b = my_upcase(a)

即使您不打算更改aba也会转换价值。删除感叹号修复了这个例子,但是如果你使用可变对象,比如哈希和数组,你也必须在其他情况下注意这一点。

a = [1,2,3]
def get_last_element(array)
  array.pop
end
b = get_last_element(a)

由于Array#pop有副作用,a现在是1,2。它删除了最后一个元素,这可能不是你想要的。您可以使用.pop[-1]替换.last以消除副作用

方法名称中的感叹号基本上警告您存在副作用。这在函数式编程的概念中很重要,函数式编程规定了无副作用的代码。 Ruby在设计上是一种非常多的函数式编程语言(尽管它也非常面向对象)。

如果你的“用例”归结为避免分配变量,这似乎是一种非常小的不适。

出于技术原因,请参阅Jorg Mittag的回答。编写一个改变self

类的方法是不可能的

答案 2 :(得分:0)

 def some_method(foo)
   foo = foo.downcase.split(" ")
 end

 some_method("A String like any other")

与此相同

def some_method(foo)
 foo.downcase.split
end
some_method("A String like any other")

答案 3 :(得分:0)

实际上,两种方法都会返回相同的结果。我们可以看一些修改调用者的方法示例。

array.map! return a modified original array
string.upcase! return a modified original string

然而,

split修改调用者的类,将字符串更改为数组。

请注意上述示例如何仅修改对象的内容,而不是更改其类。

这很可能是为什么没有split!方法,尽管自己定义一个很容易。

答案 4 :(得分:0)

#split 从字符串中创建一个数组,您不能永久地将字符串变异(!)成一个数组。因为该方法是从源信息(字符串)创建一个新表单,您唯一需要做的就是将其绑定到一个变量。