(请参阅我最喜欢的个人努力 - 此答案末尾的最终 C++ 方法)
语言一
Objective-C 但调用语法是 [object message] 所以看起来像:
int dist = [cities distanceFrom:cityA to:cityB];
如果您在城市对象中定义了distanceFromto
这样的函数:
- (int)distanceFrom:(City *)cityA to:(City *)cityB
{
// find distance between city A and city B
// ...
return distance;
}
语言二
我还怀疑您可以在IO 语言中实现与此非常接近的东西,但我只是在看它。您可能还想阅读它与七周内七种语言中的其他语言的比较,其中有关于 IO的免费摘录。
语言三
根据C++ 的设计和演变,C++中有一个习惯用法(“链接”),您可以在其中返回临时对象或用于替换关键字参数的当前对象,如下所示:
int dist = distanceFrom(cityA).to(cityB);
如果你已经定义distanceFrom
了这样的函数,带有一个小助手对象。请注意,内联函数使这种东西编译为非常有效的代码。
class DistanceCalculator
{
public:
DistanceCalculator(City* from) : fromCity(from) {}
int to(City * toCity)
{
// find distance between fromCity and toCity
// ...
return distance;
}
private:
City* fromCity;
};
inline DistanceCalculator distanceFrom(City* from)
{
return DistanceCalculator(from);
}
Duhh,我之前很着急,意识到我可以重构为只使用一个临时对象来提供相同的语法:
class distanceFrom
{
public:
distanceFrom(City* from) : fromCity(from) {}
int to(City * toCity)
{
// find distance between fromCity and toCity
// ...
return distance;
}
private:
City* fromCity;
};
MY FAVORITE
,这是一个更具启发性的 C++ 版本,它允许您编写
int dist = distanceFrom cityA to cityB;
甚至
int dist = distanceFrom cityA to cityB to cityC;
基于#define 和类的奇妙 C++ ish 组合:
#include <vector>
#include <numeric>
class City;
#define distanceFrom DistanceCalculator() <<
#define to <<
class DistanceCalculator
{
public:
operator int()
{
// find distance between chain of cities
return std::accumulate(cities.begin(), cities.end(), 0);
}
DistanceCalculator& operator<<(City* aCity)
{
cities.push_back(aCity);
return *this;
}
private:
std::vector<City*> cities;
};
注意这可能看起来像一个无用的练习,但在某些情况下,用C++ 为人们提供一种与库一起编译的特定于领域的语言可能非常有用。我们为 CSIRO 的地理建模科学家使用了与 Python 类似的方法。