2010-05-28 3 views
0

동적으로 형식이 지정된 언어에서 Object 또는 해당 객체를 검색하는 키인 인수를 갖는 것이 꽤 일반적으로 보입니다.이것에 대한 구문이 있습니까? 어떤 언어로?

: 예를 들어 나는 데이터베이스와 일하고 있어요 때 나는 방법 getMyRelatedStuff (사람)

정말 관련 물건을 조회 할 필요가 내 방법은 파이썬에서 다음과 같이 할 수 있도록 사람의 ID가있을 수 있습니다

def getMyRelatedStuff(person_or_id): 
    id = person_or_id.id if isinstance(person,User) else person_or_id 
    #do some lookup 

또는 다른 방향으로가는 :

def someFileStuff(file_or_name): 
    file = file_or_name if hasattr(file,'write') else open(file_or_name) 

편집 : 난 당신을 정의 할 수 있습니다 C#에서이 구문 내장, 내가 생각할 수있는 가장 가까운이 암시 적 및 명시 적 키워드를 찾고 있어요 유형간에 캐스트.

+0

정말 질문하지 않습니다. 당신이 알고 싶은 것은 무엇입니까? –

+0

@Nick 제목에 있습니다 –

+0

당신은 이것에 대한 내장 된 문법을 찾고 있습니까? –

답변

8

나는 생계를 위해 프로그래밍 언어를 공부합니다. 나는 그 작업을위한 내장 구문을 가진 언어를 본 적이 없다. 나는 당신이 그런 구문을 원한다는 것을 확신하지 못한다. 특히 이러한 패턴들에 대한 함수를 정의 할 수 있기 때문이다. 확장 구문처럼

+0

나는 그것이 전적으로 사실이라고 확신하지는 않습니다 (당신은 전문가이고 무례 함을 의미하지 않지만 저를 들으십시오). C++에 (조건)? (패스시 실행) :(실패시 실행); 통사론. 아마 @Michael이 언급 한 것일까 요?) – inspectorG4dget

+0

파이썬에는 삼항 연산자도 있습니다. 질문에서도 사용됩니다. – wRAR

+0

나는 정말 Lisp을 배울 필요가있다! – Michael

1

이 작업은 컴파일 할 때 함수 매개 변수의 유형을 확인하지 않는 언어로 수행 할 수 있습니다.

자바 스크립트 :

function doSomething(person) 
{ 
    var name; 
    if(typeof(person) == "string") 
    name = person; 
    else 
    name = person.name; 
    //you can simplify it to 
    name = (typeof(person) == "string") ? name : person.name; 
} 
3

:-) 리스프 매크로를 정의하는 경향이

사람들은 당신이 function overloading 찾고 계십니까? 예를 들어 :

doSomething(Person p); 
// these could do lookup and dispatch to doSomething(Person p)... 
doSomething(String personName); 
doSomething(Integer personId); 

모든 OO 강력한 형식의 언어는 그렇게 할 수 있어야합니다.

수동으로 일종의 유형 검사 (instanceof) 작업을 수행하는 것 외에는 다른 방법을 알지 못하지만 동적으로 형식이 지정된 언어의 경우 해당 메서드가 실제로 더러운 상태가 될 수 있습니다. 예를 들어 다른 이름의 함수를 사용합니다 : 당신은 우리가 OOP 전에했던 일을 더 낫다 코드가 다르게 잘 구조화되어있는 경우

doSomethingByName(personName); 
doSomethingById(personId); 

, 이러한 "중복"대부분의 기능은 아주 작은 것입니다.

2

Scheme, LISP 또는 매크로가있는 언어에 관한 것.

1

은 내가 사용한 적이있는 언어로이 내장되어 있습니다. 파이썬이 일반적 예외에 의해 처리되는

참고 :

def getMyRelatedStuff(person_or_id): 
    "The verbose way" 
    try: 
     my_id= person_or_id.id 
    except AttributeError: 
     my_id= person_or_id 

바람직 :

def getMyRelatedStuff(person_or_id): 
    "The terse way" 
    my_id= getattr(person_or_id, "id", person_or_id) 

하고 someFileStuff에 대한 : 내장의 사용을 피하는

def someFileStuff(file_or_name): 
    try: 
     fobj= open(file_or_name) 
    except TypeError: 
     fobj= file_or_name 

시도 같은 이름의 idfile과 같은 이름 de; 그들은 당신의 프로그램에 미묘한 버그를 소개합니다.

0

리스프이 쉽게 구현 될 수

사용 리스프 매크로 :

(get-if-not file? file_or_name (open file_or_name)) 

로 확장됩니다 :

(defmacro get-if-not [func val alt] 
    `(if (~func ~val) 
    ~val 
    ~alt)) 

당신은 이런 그 표현을 사용할 수 있습니다

(if (file? file_or_name) file_or_name (open file_or_name)) 

매크로는 믿을 수 없습니다. 나는 개인적으로 그 언어가없는 언어를 사용하는 것을 거부합니다.

관련 문제