2010-05-28 49 views
0

对于我来说,在一个动态类型化的语言中,我们有一个参数似乎很常见,它是一个Object或一个查找该对象的键。例如,当我与一个数据库工作,我可能有一个方法getMyRelatedStuff(人)这是否存在语法?在任何语言?

我真正需要查找相关的东西是人的ID,所以我的方法可能看起来像这样在Python:

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

你并不是真的在问一个问题。你想知道什么? – 2010-05-28 04:01:24

+0

@Nick它的标题是 – 2010-05-28 04:04:12

+0

你的意思是你正在寻找某种内置的语法? – 2010-05-28 04:20:02

回答

8

我学习编程语言为生。我从来没有见过一种语言,该语言具有该操作的内置语法。我甚至不确定你想要这样的语法,特别是因为你可以为任何这些模式定义一个函数。

人谁喜欢扩展语法通常定义Lisp的宏:-)

+0

我不完全确定这是完全正确的(你是专家,我的意思是没有不敬,但听我说)。 C++有(条件)?(执行通过):(执行失败);句法。所以也许,这就是@迈克尔所指的?) – inspectorG4dget 2010-05-28 05:15:58

+0

Python也有三元运算符,它甚至用在问题中。 – wRAR 2010-05-28 05:25:09

+0

我真的需要学习Lisp! 我想要你的工作:) – Michael 2010-05-28 05:32:51

1

您可以在编译时不检查函数参数类型的任何语言中执行此操作。

的JavaScript:

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

我从来没有见过内置这个语法在我用过的任何语言中都是这样。

注意,在Python这通常通过例外处理:

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德;他们会向您的程序中引入微妙的错误。

0

Lisp的

这可以很容易地实现使用Lisp的宏:

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

您可以使用表情是这样的:

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

,将扩大到:

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

宏是不可思议的。我个人拒绝使用任何没有它们的语言。

相关问题