当有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")
这不是什么大问题......但是!
看起来更酷。
答案 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)
即使您不打算更改a
,b
和a
也会转换价值。删除感叹号修复了这个例子,但是如果你使用可变对象,比如哈希和数组,你也必须在其他情况下注意这一点。
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 从字符串中创建一个数组,您不能永久地将字符串变异(!)成一个数组。因为该方法是从源信息(字符串)创建一个新表单,您唯一需要做的就是将其绑定到一个变量。