gpt4 book ai didi

j - 如何对 J 类执行数组操作?

转载 作者:行者123 更新时间:2023-12-04 10:54:06 24 4
gpt4 key购买 nike

我在玩 J 的面向对象工具。考虑以下非常人为的代码:

coclass 'Object'
create =: 3 : 'state =: 0'
increment =: 3 : 'state =: state + y'
destroy =: codestroy

cocurrent 'base'
objects =: (0 conew 'Object') , (0 conew 'Object') , 0 conew 'Object'

假设我想调用 increment objects 中每个对象的方法大批。我如何以 J-tastic 的方式做到这一点?我能想出的唯一方法是中间动词:
o_increment =: 4 : 0
for_o. y do.
increment__o x
end.
)

3 o_increment objects

这可行,但不是很方便。有没有更好的办法?

最佳答案

因为对象引用是 J 形态的一部分,而不是语法 ,它们在运行时比其他数据更难操作。也就是说,对象引用被烘焙到名称中,而不是指定为自由参数。

因此,有两种方法可以调用对象数组上的方法,并且都需要显式代码。第一种方法——除非在特殊情况下很少使用——是生成并执行表示完全限定名称的字符串,包括直接(显式)定位。

3 apply&>~ 'increment_' ,L:0 objects ,&.> '_'

更常见的 是在显式代码块中使用间接引用,使用预定义的局部变量之一作为定位。例如:
3 dyad def 'increment__y x'"0 objects

或者,等效地:
incrementObjs =: dyad define
increment__x y
)

objects incrementsObjs"0] 3

其实JSoftware做了一个大的 backwards-compatibility-breaking change to the language在版本 6 中专门使这种模式更方便。以前(即在 v6 之前),您必须编写如下内容:
incrementObjs =: dyad define
o =. x. NB. x and y used to be spelled x. and y.
increment__o y NB. but increment__x. would raise an error
)

在任何情况下,请注意 incrementsObjs"0 objects重新表述你的显式 for_o. objects do.循环实际上根本不特定于 OOP;这是 J 面向数组的特性提供的标准迭代自动化。

这让我得到了真正的答案回答您的问题:J 从根本上讲是一种面向数组的语言,其对象通常比 Java 或 C# 等更熟悉的语言更粗粒度。

在这些语言中,对象集合很常见。在 J 中,更常见的是有一个集合对象。也就是说,主流 OOP 语言中的对象在某种意义上是“小”的。在 J 中,对象很大,因为 J 中的所有数据都很大(我不是指物理上的“大数据”,GB 意义上的:我指的是概念上的、哲学上的、ℕ 意义上的)。

因此,表达您的问题的实际最常见的方式:
coclass 'Object'
create =: 3 : 'state =: 0'
increment =: 3 : 'state =: state + y'
destroy =: codestroy

cocurrent 'base'

objects =: 'Object' conew 0 0 0

注意最后一行 objects =: 'Object' conew 0 0 0 ;原来是 objects =: (0 conew 'Object') , (0 conew 'Object') , 0 conew 'Object' .

也就是说:我们创建了一个对象,而不是一个包含 3 个对象的数组,而是一个包含 3 个值的数组。

另请注意,这是我更改的唯一代码行。从处理标量值的对象到管理任意数量值的数组的“重构”需要零字节的代码更改。

但是增加所有对象呢?之前,你不得不说:
3 dyad def 'increment__y x'"0 objects

现在,你只需要说:
increment__objects 3   

这就是为什么这是 J 1 中 OOP 的标准方法。

1 好吧,一个愤世嫉俗的人可能会说 J 的基本数组性质在某种程度上排除甚至与 OOP 的目标相冲突,并且 J 中可用的 OO 功能是在 90 年代后期 OOP 兴起期间作为事后的想法而添加的,但我并不愤世嫉俗。至少不公开。

OOP 在 J 中占有一席之地,尤其是用于组织动态系统中的大型组件;它的使用方式与基本哲学是 OO 而不是 AO 的语言不同。

关于j - 如何对 J 类执行数组操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29204478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com