标签: first-class

什么是Java和C#中的第一类对象?

多年前,当我开始编写OO编程时,我得到的印象是变量(如果这是正确的词)是"基元"(int,double等)或第一类对象(String,JPane等).最近关于Java和C#中的原语的回答进一步证实了这一点(@Daniel Pryden:Java和C#中的原始类型是不同的吗?).但是不知道C#ValueTypes是基元,对象还是其他一些野兽,比如二等对象.我看到SO只使用了一个first-class标签,所以它可能不再是一个有用的术语.

我没有发现维基百科的文章有用("这篇文章需要关于这个主题的专家的关注.").我要感谢分类和当前使用的术语,主要与Java和C#有关(尽管其他语言可能会有所启发).

澄清:我想理解一流的术语以及它的使用范围.

c# java first-class

29
推荐指数
3
解决办法
2万
查看次数

Java和C#中的原始类型是不同的吗?

我手动将代码从Java转换为C#并与(我称之为)原始类型进行斗争(参见,例如,自动装箱和拆箱在Java和C#中表现不同).从答案我明白double(C#)和Double(C#)是等价的,double(C#)也可以用在容器中,例如作为字典中的键.但是,double(Java)不能在像HashMap这样的容器中使用,因为它是自动装箱Double(Java)的原因.

  1. double(C#)一个原始或对象?
  2. 如果它是一个原始的,它使它的行为与double(Java)不同?

double除非它被创建,否则不能将(C#)设置为null nullable.

  1. double?(C#)相当于Double(Java)的?它们都被称为物体吗?

(在这个讨论中,"第一类对象"一词的用法是否有用?)

c# java primitive first-class

14
推荐指数
2
解决办法
6916
查看次数

scala案例模式是一流的吗?

是否可以将案例模式作为参数传递给其他函数?像这样的东西:

def foo(pattern: someMagicType) {
  x match {
    pattern => println("match")
  }
}

def bar() {
  foo(case List(a, b, c))
}
Run Code Online (Sandbox Code Playgroud)

scala pattern-matching first-class

8
推荐指数
1
解决办法
260
查看次数

一流的公民

维基文章中的一等公民定义说:

一个对象是第一类的

  • 可以存储在变量和数据结构中
  • 可以作为参数传递给子程序
  • 可以作为子例程的结果返回
  • 可以在运行时构建
  • 具有内在身份(独立于任何给定名称)

有人可以解释/详细说明第5项要求(粗体)吗?我觉得这篇文章应该提供更多细节,因为"内在身份"正在捕捉到什么意义.

也许我们可以在我们的讨论中使用Javascript中的函数和C中的函数来说明第5个子弹.

我相信C中的函数是第二类的,而函数在Javascript中是一流的,因为我们可以在Javascript中执行以下操作:

var foo = function () { console.log("Hello world"); };
Run Code Online (Sandbox Code Playgroud)

,在C中是不允许的.

同样,我的问题实际上是在第5个子弹(要求).

first-class

7
推荐指数
1
解决办法
3093
查看次数

Erlang中的一流模式?(备择方案)

有没有办法在 Erlang 中创建一流的模式?我需要能够创建模式并将其作为参数传递给其他函数,但我知道模式在 Erlang 中并不是一流的。我还研究了 Elixir,但就模式而言,它似乎没有提供更多信息。

我想知道是否有人想出了一个简单的解决方案来解决这个问题。我正在考虑尝试实现这样的东西:

% Instead of using variables, we would just use uppercase atoms which would serve as vars
% A passable pattern
Pattern = {ok, 'Result'}. 

% Custom function to check for matches
match(pattern, {ok, [1,2,3]}). % => true
Run Code Online (Sandbox Code Playgroud)

我是 Erlang 的新手,所以也许这完全没有必要。也许有一个图书馆可以做这种事情?

任何意见是极大的赞赏。提前致谢!

erlang elixir pattern-matching first-class

4
推荐指数
1
解决办法
274
查看次数

Common Lisp 中的类型在什么意义上是一流的?

Peter Norvig 曾说过,许多 OOP 设计模式在 Lisp 中都是微不足道或多余的。这里的幻灯片 #10声称一流类型取代了其中的许多类型。

在什么意义上,Common Lisp 中的类型是一流的?作为参考,《计算机程序的结构和解释》给出了以下编程语言元素必须满足的条件才能被视为一流:

  1. 它们可以通过变量命名。

  2. 它们可以作为参数传递给过程。

  3. 它们可以作为程序的结果返回。

  4. 它们可能包含在数据结构中

证明 Common Lisp 中的类型满足上述条件将是一个很好的答案。

types common-lisp first-class

4
推荐指数
1
解决办法
149
查看次数

动态地在OCaml中实例化模块

我有几个模块实现相同的接口.我想根据命令行中给出的一个参数只加载该模块中的一个.

我在考虑使用一流的模块,但问题是我想在模块实例化之前执行一些功能.

目前我有这个:

module Arch = (val RetrolixAbstractArch.get_arch() : RetrolixAbstractArch.AbstractArch)


let get_arch () =
  let arch = Options.get_arch() in
  if arch = "" then
    Error.global_error "During analysis of compiler's architecture"
               "No architecture specified"
  else
    if arch = "mips" then
      ( module MipsArch : AbstractArch)
    else
    Error.global_error "During analysis of compiler's architecture"
               (Printf.sprintf "Architecture %s not supported or unknown" arch)      
Run Code Online (Sandbox Code Playgroud)

但由于命令行尚未解析,请Options.get_arch给我空字符串.

我想在执行此函数之前实现命令行解析(不在函数中添加解析).可能吗 ?我应该找到另一种方法来实现这一目标吗?

command-line ocaml module first-class

3
推荐指数
1
解决办法
157
查看次数

如何实现typeOf函数?

由于类型在Idris中是一流的,我似乎应该能够编写一个typeOf返回其参数类型的函数:

typeOf : a => a -> Type
typeOf x = a
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试调用此函数时,我得到的内容看起来像一个错误:

*example> typeOf 42
Can't find implementation for Integer
Run Code Online (Sandbox Code Playgroud)

我该如何正确实现这个typeOf功能?或者是否有一些更为微妙的关于"获取价值类型"的想法,这是我想要的,这会阻止这种功能的存在?

types function first-class idris

3
推荐指数
1
解决办法
140
查看次数

将类存储在Map中,以便可以实例化它们

我希望能够根据HashMap条目创建类的实例.

例如,这是我试着写下我的头脑:

public class One implements Interface {
  public void sayName() {
    System.out.println("One");
  }
}

public class Two implements Interface {
  public void sayName() {
    System.out.println("Two");
  }
}

Map<String, Interface> associations = new HashMap<String, Interface>();

associations.put("first", One);
associations.put("second", Two);

Interface instance = new associations.get("first")();

instance.sayName(); // outputs "One"
Run Code Online (Sandbox Code Playgroud)

但我强烈怀疑这在Java中不起作用.


我的情况:我想创建一种将String名称与类相关联的方法.

用户可以使用其"名称"创建类的实例.

我想尝试:为类创建一个名称映射(我不知道如何在地图中存储类),并从地图中获取与"name"匹配的项目,然后实例化它.

那不行.


如何将类与String名称关联,并使用我给出的"名称"来实例化这些类?

java oop dictionary class first-class

2
推荐指数
1
解决办法
68
查看次数

javascript中警报功能的意外行为

我正在试验警报,但警报不起作用,因为我预期看到下面的线条:

var tobealerted = function(){return 'worked!'};
Run Code Online (Sandbox Code Playgroud)

现在当我提醒这个:

alert(tobealerted());
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作!现在

alert(tobealerted);
Run Code Online (Sandbox Code Playgroud)

在这个我删除括号.现在它警告function(){return "worked"}不是worked! 现在我认为它可能是javascript的一个功能,它会提醒任何文本,而不是在引号然后我写道:

alert(worked!)
Run Code Online (Sandbox Code Playgroud)

但谷歌控制台抛出异常worked!是未定义的,所以我的想法是错误的.然后我又写了这个

alert(function(){})
Run Code Online (Sandbox Code Playgroud)

而且你知道它的警告function(){}!然后我认为警报只允许在没有引号的情况下发出警告.然后又写道:

alert(if(){}) //if is not defined
alert(for(){}) //for is not defined
alert(while(){}) //while is not define
Run Code Online (Sandbox Code Playgroud)

但这些对我来说没有用,我搜索并发现了一些东西,从我的搜索中我发现了这个

函数是第一类对象

并根据维基百科:

在计算机科学中,如果将编程语言视为一等公民,则称其具有一流的功能.具体来说,这意味着该语言支持将函数作为参数传递给其他函数,将它们作为其他函数的值返回,并将它们分配给变量或将它们存储在数据结构中

所以我的问题是

为什么alert功能只允许function (){}被警告而不是其他人

如果你认为这是因为该函数是一流的对象,那么我不这么认为,因为我没有将这个函数(最后一个)分配给任何变量,它既不返回任何内容 alert(function(){})

我非常好奇也很困惑!谢谢!

javascript alert function first-class

0
推荐指数
1
解决办法
186
查看次数