有哪些语言具有类似于 Smalltalk 的消息传递语法?Objective-C 是我唯一熟悉的。具体来说,我想知道是否存在任何其他语言实现,它允许以下形式的语法:[anObject methodWithParam:aParam andParam:anotherParam]
,具有允许命名参数作为方法定义一部分的消息。
总的来说,我发现这种语法有助于更一致的方法名称,更清楚地显示方法的意图,并且你为冗长付出的代价通常是值得的。我很想知道是否有任何其他语言支持这一点。
有哪些语言具有类似于 Smalltalk 的消息传递语法?Objective-C 是我唯一熟悉的。具体来说,我想知道是否存在任何其他语言实现,它允许以下形式的语法:[anObject methodWithParam:aParam andParam:anotherParam]
,具有允许命名参数作为方法定义一部分的消息。
总的来说,我发现这种语法有助于更一致的方法名称,更清楚地显示方法的意图,并且你为冗长付出的代价通常是值得的。我很想知道是否有任何其他语言支持这一点。
以下是支持类似于 Smalltalk 的关键字消息语法的语言列表:
除了这里提到的其他语言,Fancy:
osna = City new: "Osnabrück"
p = Person new: "Christopher" age: 23 city: osna
p println
berlin = City new: "Berlin"
p go_to: berlin
p println
参见例如Self。
此外,许多语言支持可选的命名参数,例如 Python 或 C#(从 v4 开始)。
Python 和 Common Lisp(可能还有其他)允许关键字参数。您可以调用包含参数名称的函数。
这些不等同于 Obj-C 的方法名称,因为关键字 args忽略位置,但它们回答了您关于可读性的问题。*
make_an_omelet(num_eggs=2, cheese=u"Gruyère", mushrooms=True)
(make-a-salad :greens 'boston-lettuce
:dressing 'red-wine-vinaigrette
:other-ingredients '(hazelnuts dried-apricots))
当然,这不是消息传递,只是普通的旧函数调用。
*它们还有其他用途,例如指定默认值。
Ada 支持命名参数。
function Minimum (A, B : Integer) return Integer is
begin
if A <= B then
return A;
else
return B;
end if;
end Minimum;
然后调用:
Answer := Minimum (A=>100, B=>124);
Ruby 可以向对象发送消息以调用它们的方法,就像 objc 一样:
class Foo
def bar a,b
a + b
end
end
f = Foo.new
f.send(:bar, a=4, b=5)
>> 9
事实上,这使得 Cocoa 和 Ruby 在 MacRuby 中的集成成为可能
Erlang并不声称是面向对象的,但消息传递是该语言的一个关键概念。