2014-04-08 59 views
2

我使用阵列来指定2维数组的索引试过,但pick功能将不接受的阵列作为第二元件:如何访问数组索引在REBOL多维数组

print pick [[3 5] [3 1]] [2 1] 

*** ERROR 
** Script error: invalid argument: [2 2] 
** Where: pick try do either either either -apply- 
** Near: pick [[3 5] [3 1]] [2 2] 

我发现这是一个解决办法,但它是稍微详细:

print pick pick [[3 5] [3 1]] 2 1 
[comment This prints "3".] 

是否有可能访问多维数组的索引,而不调用pick函数多次?

回答

2

从多维数组中排除元素的更简洁的方法是使用PATH!语法。

下面是Rebol的控制台例如:

>> x: [[3 5] [3 1]]  
== [[3 5] [3 1]] 

>> x/2/1 
== 3 

>> x/2/2      
== 1 

>> x/1/(1 + 1)  ;; use parens for expressions - transforms to x/1/2 
== 5 

>> p: 2 
== 2 

>> x/1/:p   ;; use ":" for variable reference - transforms to x/1/2 
== 5 

>> x/(p - 1)/:p  ;; mix and match at any level of array - transforms to x/1/2 
== 5  

>> x/3    ;; NONE is returned if index does not exist 
== none 

>> x/2 
== [3 1] 

>> x/2/3   ;; again out of range 
== none 

另一种办法是FIRSTSECOND .. TENTH功能:

>> second first [[3 5] [3 1]] 
== 5 

您甚至可以混合和匹配:

>> x: [ [[1]] [[2]] [3 [4 5]] ] 
== [[[1]] [[2]] [3 [4 5]]] 

>> first pick x/3 2 
== 4 
+0

会有任何方法在PATH中包含表达式!语法,如'x /(10 + 1)/ 3'?或'x /(3 + 4)/ 10'?我已经尝试了这两种方法,并且总是返回'none'。 –

+0

@AndersonGreen - 是的,你可以。我会用一些例子更新答案。 – draegtun

+0

@AndersonGreen - PS。为了您的评论示例能够记住空格 - 'x /(var1 + 1)'和'x /(3 + 4)'。更新 - 自我评论以来,您已经修改了您的评论!您的新示例正在返回'none',因为这些索引超出范围。我会将其添加到我的示例中。 – draegtun