2011-01-21 5 views
2

안녕하세요 여러분, 나는 나에게 이해하는 구문이 비트를 얻으려고 :D의 확장 방법?

S[] split(S)(S s) if (isSomeString!S) 
{ 
    ... 
} 

string join(in string[] words, string sep) 
{ 
    ... 
} 

를 I로 지금까지

을 (phobos/src/std/string.d에서 보는 바와 같이) 이것은 우리가 다음과 같이 할 수있는 코드 조각입니다.

string[] parts = "/foo/bar/baz".split("/"); // string[] {"foo", "bar", "baz"} 
string part = parts.join("-"); // string "foo-bar-baz" 

기본적으로 내가 CSharp에서 알고있는 확장 방법과 같은 것이 d에서 가능하다고 믿게합니다. 내가 가진 문제는 다음과 같습니다

나는 내가 그들과 유사하게 무엇을 참조하지 않는 것이 여기
  • 올바른 함수 선언에서 찾고 있어요 100 % 확신 그건
    1. .
  • +2

    docs : http://www.digitalmars.com/d/2.0/arrays.html#func-as-property. –

    답변

    7

    이들은 확장 메소드가 아니며 일부 버그는 깔끔한 기능으로 바뀌 었습니다.

    두 가지 방법의 유사점은 둘 다 첫 번째 매개 변수로 문자열을가집니다. 그래서 여기 직장에있는 트릭, D에서

    arr.foo(some arguments matching other params) 
    
    +1

    D2는 모든 유형에이 기능을 일반화하기 위해 제공되었지만 Walter가이 기능을 사용하는지 여부는 알 수 없습니다. – FeepingCreature

    +1

    정말 버그라고 확신하지 못합니다. 나는 그것이 의도적으로 였다고 생각한다. OTOH 거의 모든 사람들이 잘못된 유형의 기능을 수행한다는 사실을 거의 모든 사람이 고려합니다. – BCS

    +3

    이 기능을 "통일 기능 호출 구문"이라고합니다. 아니요, D2의 다른 유형에는 아직 구현되지 않았습니다. http://stackoverflow.com/questions/3868511/non-member-range-functions/3868943#3868943도 참조하십시오. – stephan

    3

    을 수행하여 호출 될 수있는 배열을 임의의 함수를 배열 T [] 도착 및 기능

    U foo (T[] t, other params) 
    

    부여되었는지 첫 번째 인수가 해당 배열의 멤버 함수 인 것처럼 호출 될 수 있기 때문입니다. 문자열은 배열이므로 문자열을 포함합니다. 그래서,

    T[] replace(in T[] array, in T[] from, in T[] to) 
    

    같은 두 가지 방법으로 호출 할 수 있습니다 :이 기능은 현재는 IIRC 배열 (작동

    auto replacedStr1 = replace("hello world", "hello", "goodbye"); 
    auto replacedStr2 = "hello world".replace("hello", "goodbye"); 
    
    , 그것은 약 때문에 그것을 허용 버그에 온

    를, 그리고 결정했다 실제로 가지고있는 것이 좋았 기 때문에 실제로 언어의 일부가되었습니다). 그러나 언젠가는 모든 유형에 대해 작동하도록 만들어졌습니다. 모든 유형에 대해 작동하도록하는 것을 유니폼 함수 호출 구문이라고합니다. 즉, 구현, 당신은

    auto bigger = 2.max(5); 
    

    같은 물건을 할 수있을 것입니다하지만 균일 한 함수 호출 구문이 아직 구현되지 않았기 때문에, 당신은 단지 배열 그런 일을 할 수 있습니다. 함수에 대한 첫 번째 인수로 전달하는 대신 문자열로 프로그래밍하는 것이 일반적입니다.