2011-06-19 15 views
5

Tôi cố gắng để xác định quy tắc thay thế với tùy chọn luận color_RGBColor cần được thay thế bằng Sequence[] khi nó vắng mặt trong biểu thức ban đầu:Pattern với đối số tùy chọn trong quy tắc thay thế

style[line_Line, ___, 
    color_RGBColor: [email protected][], ___] :> {color, line} 

Khi RGBColor hiện diện trong biểu hiện ban đầu, nguyên tắc hoạt động:

style[Line[], RGBColor[{}]] /. 
style[line_Line, ___, 
    color_RGBColor: [email protected][], ___] :> {color, line} 

=> {RGBColor[{}], Line[]} 

Nhưng khi nó vắng mặt, nó không:

style[Line[], Thickness[0.01]] /. 
Style[line_Line, ___, 
    color_RGBColor: [email protected][], ___] :> {color, line} 

=> style[Line[], Thickness[0.01]] 

Câu hỏi của tôi là:

1) Tại sao nó không hoạt động?

2) Có thể xây dựng một mẫu đơn sẽ hoạt động như mong muốn không?

Trả lời

7

Mẫu của bạn không hoạt động do cách đối sánh mẫu hoạt động cho đối số mặc định (tùy chọn) và cũng vì bạn đã hạn chế đầu là RGBColor. Vấn đề là giá trị đối số mặc định phải khớp với mẫu, trong khi Unevaluated[Sequence[]] chắc chắn không khớp với _RGBColor.

Bạn có một số cách. Nỗ lực đầu tiên là làm suy yếu việc kiểm tra loại của bạn:

In[10]:= style[Line[],Thickness[0.01]]/. 
style[line_Line,___,color_: [email protected][],___]:>{color,line} 

Out[10]= {Thickness[0.01],Line[]} 

Nhưng điều này không hoạt động vì kết hợp không đúng - quá trình nhập thực sự quá yếu. Cách hacky để làm cho nó làm việc là thế này:

In[14]:= style[Line[], RGBColor[{}]] /. 
style[line_Line, ___, color : (_RGBColor | _Unevaluated) : 
    [email protected][], ___] :> {[email protected], line} 


Out[14]= {RGBColor[{}], Line[]} 

In[15]:= style[Line[], Thickness[0.01]] /. 
    style[line_Line, ___, color : (_RGBColor | _Unevaluated) : 
    [email protected][], ___] :> {[email protected], line} 

Out[15]= {Line[]} 

cách khuyến khích để làm điều đó là thế này:

In[18]:= style[Line[], Thickness[0.01]] /. 
style[line_Line, ___, color : (_RGBColor | Automatic) : Automatic, ___] :> 
    If[color === Automatic, {line}, {color, line}] 


Out[18]= {Line[]} 

In[17]:= style[Line[], RGBColor[{}]] /. 
style[line_Line, ___, color : (_RGBColor | Automatic) : Automatic, ___] :> 
    If[color === Automatic, {line}, {color, line}] 


Out[17]= {RGBColor[{}], Line[]} 

Tính năng này của mô hình-khớp không phải là biết rất rộng rãi, vì vậy tôi sẽ nhấn mạnh một lần nữa: giá trị mặc định cho mẫu (tùy chọn) x:ptrn:default phải khớp với ptrn. Để biết ví dụ khác về hành vi như vậy, hãy xem this Thảo luận nhóm.

+0

Cảm ơn bạn! Tính năng này có hoàn toàn không có giấy tờ không? –

+0

Tôi chưa thấy tài liệu đó, nhưng có thể là tôi không chú ý đủ và nó được viết ở đâu đó trong tài liệu. –

2

Có lẽ công trình này dành cho bạn:

style[Line[a], RGBColor[{}]] /. 
style[line_Line, ___, Longest[color___RGBColor], ___] :> {color,line} 
(* 
{RGBColor[{}], Line[a]} 
*) 

style[Line[]] /. 
style[line_Line, ___, Longest[color___RGBColor], ___] :> {color, line} 
(* 
{Line[]} 
*) 

Tôi đoán cai trị thay thế của bạn không làm việc chỉ vì không có phần tử với một Trưởng RGBColor, do đó không phù hợp.

+0

Bằng cách này 'Longest' và thậm chí là' Tùy chọn' là không cần thiết - thay thế 'Blank' bằng' BlankNullSequence' thực hiện thủ thuật: 'style [Line []] /. kiểu [line_Line, ___, color___RGBColor, ___]:> {color, line} '. Nhưng tại sao nó không hoạt động với 'Blank'? –

+0

@Alexey Tôi đã chỉnh sửa khi bạn đăng nhận xét của mình :). Tôi đã làm như vậy –

Các vấn đề liên quan