我是Ruby中的新手。請解釋*操作符在這種情況下的工作原理。Ruby中Array的'*'操作符的行爲
arr = [1,2,3]
p arr
arr = *[1,2,3]
p arr
*arr = [1,2,3]
p arr
arr = [1,2,3]
p *arr
OUTPUT
[1,2,3]
[1,2,3]
[1,2,3]
最後一種情況發生了什麼?它表現爲迭代器嗎?任何人都可以舉例說明如何使用它? 爲什麼它在第二和第三種情況下沒有效果?
我是Ruby中的新手。請解釋*操作符在這種情況下的工作原理。Ruby中Array的'*'操作符的行爲
arr = [1,2,3]
p arr
arr = *[1,2,3]
p arr
*arr = [1,2,3]
p arr
arr = [1,2,3]
p *arr
OUTPUT
[1,2,3]
[1,2,3]
[1,2,3]
最後一種情況發生了什麼?它表現爲迭代器嗎?任何人都可以舉例說明如何使用它? 爲什麼它在第二和第三種情況下沒有效果?
該上下文中數組上的「*」運算符將數組轉換爲參數列表。
比方說,你有三個參數的方法:
def takes_three(one, two, three)
puts "first: #{one}, second: #{two}, third: #{three}"
end
如果你想做到這一點:
arr = ["a", "b", "c"]
takes_three(arr)
# => ArgumentError: wrong number of arguments (1 for 3)
你的方法有三個參數,但只通過了它一個 - 那是一個數組。
如果你想打開三個元素的數組分成三個獨立的參數的方法,這就是*
在這裏所做的:
takes_three(*arr)
# => puts "first: a, second: b, third: c"
什麼在你的例子變得混亂,無論你相信與否,是您的使用p
,irb中的快捷方式爲puts
。 puts
需要可變數量的參數,可以給它多少你想要的。它會將它們全部輸出,並用換行符分隔。如果你給它一個單一的數組參數,它仍然會輸出由換行符分隔的數組中的每個元素。
irb(main):068:0> puts ["a", "b", "c"]
a
b
c
irb(main):069:0> puts "a", "b", "c"
a
b
c
irb(main):070:0> puts arr
a
b
c
irb(main):071:0> puts *arr
a
b
c
由於puts "a", "b", "c"
和puts ["a", "b", "c"]
做同樣的事情,puts arr
和puts *arr
做同樣的事情。由於puts *arr
相當於puts 1, 2, 3
,因此它將數組擴展爲該方法的單獨參數。
所以你嘗試以調查puts
使得它混亂,因爲puts
採用可變數量的參數,做同樣的事情用一個論點,即是n個元素的數組,因爲它具有n個獨立的參數每一元素。大多數方法不會這樣工作,所以對於大多數方法*
來說,改變你給該方法的參數的性質,也會改變該方法的功能。這對於一種間接方式很有用,在這種方式下,您將動態構建要在數組中傳遞的參數,而不是將它們寫入源代碼中。
這就是splat運算符(*)。它可以用於將方法調用中的數組展開爲參數列表,或者將其分配給「全部獲取」。下面是一些例子:
1)使用通陣列方法調用作爲參數列表
考慮以下方法:
def my_method(argument1, argument2, argument3)
end
你可以把數組與參數列表* (或圖示)運算符:
arguments = [1, 2, 3]
my_method(*arguments)
https://ruby-doc.org/core-2.2.0/doc/syntax/calling_methods_rdoc.html
與分配到使用爲「採取一切」*
2),有時被稱爲「操作者圖示,」做了許多事情與陣列。當它位於賦值運算符(=)的左側時,就像在你的例子中那樣,它只是意味着「把所有的東西都留下」。
例子:
a = [1, 2, 3, 4, 5]
head, *tail = a
p head #=> 1
p tail #=> [2, 3, 4, 5]
如果省略代碼的圖示,它會做這個:
head, tail = [1, 2, 3, 4, 5]
p head # => 1
p tail # => 2
但是當你的圖示添加到尾巴的意思是「一切,沒」 t分配給前面的變量(head),分配給tail。「
同樣的問題在這裏:http://stackoverflow.com/questions/1729284/ruby-what-does-the-asterisk-in-p-1-10-mean – limekin 2015-02-23 14:11:17
可能[在Ruby中\ *(星號)是什麼意思?](http://stackoverflow.com/questions/4170037/what-does-the-star-mean-in-ruby) – WattsInABox 2015-02-23 15:55:28