哪些语言的消息传递语法类似于Smalltalk? Objective-C是我唯一熟悉的。具体来说,我想知道是否存在任何其他语言实现允许使用如下形式的语法:[anObject methodWithParam:aParam andParam:anotherParam]
,具有允许命名参数作为方法定义的一部分的消息。
一般来说,我发现这种语法有助于更一致的方法名称,更清楚地显示方法的意图,而且你付出的字面价格通常是值得的。我很想知道是否有其他语言可以支持这一点。
答案 0 :(得分:14)
以下是支持与Smalltalk类似的关键字消息语法的语言列表:
答案 1 :(得分:5)
除了此处提到的其他语言,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
答案 2 :(得分:3)
参见例如Self
此外,许多语言都支持可选的命名参数,例如: Python或C#(从v4开始)。
答案 3 :(得分:2)
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))
当然,这不是消息传递,只是简单的旧函数调用。
*它们还有其他用途,例如指定默认值。
答案 4 :(得分:0)
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);
答案 5 :(得分:-1)
Ruby可以向对象发送消息以调用他们的方法,就像objc一样:
class Foo
def bar a,b
a + b
end
end
f = Foo.new
f.send(:bar, a=4, b=5)
>> 9
事实上,除此之外,这使得MacRuby中Cocoa和Ruby之间的集成成为可能
答案 6 :(得分:-1)
Erlang并不声称是面向对象的,但是消息传递是该语言的关键概念。