24

有哪些语言具有类似于 Smalltalk 的消息传递语法?Objective-C 是我唯一熟悉的。具体来说,我想知道是否存在任何其他语言实现,它允许以下形式的语法:[anObject methodWithParam:aParam andParam:anotherParam],具有允许命名参数作为方法定义一部分的消息。

总的来说,我发现这种语法有助于更一致的方法名称,更清楚地显示方法的意图,并且你为冗长付出的代价通常是值得的。我很想知道是否有任何其他语言支持这一点。

4

7 回答 7

14

以下是支持类似于 Smalltalk 的关键字消息语法的语言列表:

于 2011-05-26T23:07:28.887 回答
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
于 2011-06-03T01:06:05.353 回答
3

参见例如Self

此外,许多语言支持可选的命名参数,例如 Python 或 C#(从 v4 开始)。

于 2011-05-26T21:46:41.137 回答
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))

当然,这不是消息传递,只是普通的旧函数调用。


*它们还有其他用途,例如指定默认值。

于 2011-05-26T22:11:27.247 回答
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);
于 2011-05-27T19:20:53.733 回答
-1

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 中的集成成为可能

于 2011-05-26T21:56:10.000 回答
-1

Erlang并不声称是面向对象的,但消息传递是该语言的一个关键概念。

于 2011-05-29T15:58:02.833 回答