2016-12-15 17 views
-6

왜 스위프트는이 기능 표기법을 사용 않습니다. Type identifier()과 같이 더 현명한 대신 func identifier() -> Type을 입력하십시오.신속한 기능 표기법을 추측하고 있습니까? 는 반환 유형을 지정할 수있는 작은 화살표 <code>-></code> 표기법을 사용 왜하지 않는</p> <pre><code>func greet(person: String, day: String) -> String { return "Hello (person), today is (day)." } </code></pre> <p>:

하스켈에서 비슷한 표기법을 보았지만 하스켈이 카스 렛된 함수를 사용하기 때문에 하스켈에서 의미가 있습니다. 따라서 화살표는 함수의 커링을 나타냅니다. 신속하게 그것은 단지 길고 불필요한 것처럼 보입니다.

이 디자인을 선택한 이유는 무엇입니까?

객관적으로 대답하십시오. 이것은 의견을 묻는 것이 아니기 때문에 의견을 바탕으로 한 것이 아니며 디자인 선택의 배경에 대한 추론을 알고 싶습니다.

+0

스위프트에도 기능이 있습니다. – Alexander

+0

40 년 된 언어가 그렇듯이 '타입 식별자()'가 "가장 현명한"이유라고 생각하게하는 이유 – Alexander

+0

@AlexanderMomchliov @AlexanderMomchliov 나는 그것이 "가장 현명한"것이라고 생각하지 않습니다. 따옴표를 사용하십시오. 나는 신속하게 내가 말할 수있는 아무 이유없이 지나치게 장황한 것을 사용하고있는 것처럼 보인다. 프로그래머가 익숙한 것을 왜 바꾸어야합니까? 이유가 있어야하는데, 이것이 내가이 질문을하는 이유입니다. – theonlygusti

답변

2

이 질문은 의견의 근거로 99 %가 닫힐 수 있지만, 나는이 선택에 동기를 부여했을 수도있는 것에 대해 객관적인 찔러보기를 시도 할 것입니다.

대부분의 C 언어와 같은 형식은 Type identifier(params)입니다. 말할 것도없이, 이것은 C의 독창적 인 디자인에서 비롯된 것입니다. C++, Java, C#은 모두이 스타일을 따릅니다.

이 스타일은 처음에는 유형을 읽고 정신적으로 파싱하지 않으면 메소드 이름을 골라 내기가 어렵 기 때문에 중요하지 않은 유형의 경우 중요한 문제가 있습니다. 이 꽤 일반적인 자바 방법을 고려

... 
public static final Map<String, Array<MyGenericType<Foo, Bar>>> myMethodName(Type param) { ... } 
... 

메소드 이름, myMethodName가, 중간 화면을 가로 질러이다 (당신이 관대 한 120 문자 코드 표준을 지배 따라 가정, 그리고 80 문자 하나). 정말 바보 같아요.

스타일 가이드가 여기에서 선택되었으며 많은 C 언어의 경우 이전 줄에 모든 유형 정보, 액세스 지정자 등이 포함 된 새 줄에 이름을 입력하는 것이 좋습니다. 이것은 C++에서 특히 널리 퍼집니다.

이것을 고려하십시오. 실 제 C++의 Boost 라이브러리 예제.

template <class A1, class A2, class A3, class A4, class A5, class A6> 
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type 
auto make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&) 
{ 
    typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type; 
    return result_type(); 
} 

을하지만, 어떤 경우, C++이 광기를 실현 팀, 그리고 지금은 다음과 같이 작성 될 수 있도록 다음과 같습니다 : 그것을 제안

template <class A1, class A2, class A3, class A4, class A5, class A6> 
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&) 
{ 
    typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type; 
    return result_type(); 
} 

대부분은 다음과 같이 쓸 수

template <class A1, class A2, class A3, class A4, class A5, class A6> 
make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&) -> inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type 
{ 
    typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type; 
    return result_type(); 
} 
+0

C++ 11은 기존의'type function() {}'구문뿐만 아니라'auto function() -> type {}'구문을 지원합니다. – Ferruccio

+0

나는 그것이 의견 기반으로 닫히는 이유를 모르겠다. 확실한 대답이있다. _might_가 선택의 동기가 된 것을 알고 싶지 않습니다. "이 디자인 선택에 대한 추론은 무엇 이었습니까?" – theonlygusti

+0

@Ferruccio WOAH, 정말 멋지다! 나는'auto'에 대해서 알고 있었지만, 나는이 맥락에서 그것을 본 적이 없다. 정말 멋지다! "C++ 11"을 많이 사용할수록 새로운 언어처럼 느껴집니다. – Alexander