2015-02-23 68 views
0

我是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]

最後一種情況發生了什麼?它表現爲迭代器嗎?任何人都可以舉例說明如何使用它? 爲什麼它在第二和第三種情況下沒有效果?

+0

同樣的問題在這裏:http://stackoverflow.com/questions/1729284/ruby-what-does-the-asterisk-in-p-1-10-mean – limekin 2015-02-23 14:11:17

+0

可能[在Ruby中\ *(星號)是什麼意思?](http://stackoverflow.com/questions/4170037/what-does-the-star-mean-in-ruby) – WattsInABox 2015-02-23 15:55:28

回答

0

該上下文中數組上的「*」運算符將數組轉換爲參數列表。

比方說,你有三個參數的方法:

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中的快捷方式爲putsputs需要可變數量的參數,可以給它多少你想要的。它會將它們全部輸出,並用換行符分隔。如果你給它一個單一的數組參數,它仍然會輸出由換行符分隔的數組中的每個元素。

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 arrputs *arr做同樣的事情。由於puts *arr相當於puts 1, 2, 3,因此它將數組擴展爲該方法的單獨參數。

所以你嘗試以調查puts使得它混亂,因爲puts採用可變數量的參數,做同樣的事情用一個論點,即是n個元素的數組,因爲它具有n個獨立的參數每一元素。大多數方法不會這樣工作,所以對於大多數方法*來說,改變你給該方法的參數的性質,也會改變該方法的功能。這對於一種間接方式很有用,在這種方式下,您將動態構建要在數組中傳遞的參數,而不是將它們寫入源代碼中。

0

這就是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。「

來源: What does this mean in Ruby language?