多年前,当我开始编写OO编程时,我得到的印象是变量(如果这是正确的词)是"基元"(int,double等)或第一类对象(String,JPane等).最近关于Java和C#中的原语的回答进一步证实了这一点(@Daniel Pryden:Java和C#中的原始类型是不同的吗?).但是不知道C#ValueTypes是基元,对象还是其他一些野兽,比如二等对象.我看到SO只使用了一个first-class标签,所以它可能不再是一个有用的术语.
我没有发现维基百科的文章有用("这篇文章需要关于这个主题的专家的关注.").我要感谢分类和当前使用的术语,主要与Java和C#有关(尽管其他语言可能会有所启发).
澄清:我想理解一流的术语以及它的使用范围.
我手动将代码从Java转换为C#并与(我称之为)原始类型进行斗争(参见,例如,自动装箱和拆箱在Java和C#中表现不同).从答案我明白double(C#)和Double(C#)是等价的,double(C#)也可以用在容器中,例如作为字典中的键.但是,double(Java)不能在像HashMap这样的容器中使用,因为它是自动装箱Double(Java)的原因.
double(C#)一个原始或对象?double(Java)不同?double除非它被创建,否则不能将(C#)设置为null nullable.
double?(C#)相当于Double(Java)的?它们都被称为物体吗?(在这个讨论中,"第一类对象"一词的用法是否有用?)
是否可以将案例模式作为参数传递给其他函数?像这样的东西:
def foo(pattern: someMagicType) {
x match {
pattern => println("match")
}
}
def bar() {
foo(case List(a, b, c))
}
Run Code Online (Sandbox Code Playgroud) 维基文章中的一等公民定义说:
一个对象是第一类的
有人可以解释/详细说明第5项要求(粗体)吗?我觉得这篇文章应该提供更多细节,因为"内在身份"正在捕捉到什么意义.
也许我们可以在我们的讨论中使用Javascript中的函数和C中的函数来说明第5个子弹.
我相信C中的函数是第二类的,而函数在Javascript中是一流的,因为我们可以在Javascript中执行以下操作:
var foo = function () { console.log("Hello world"); };
Run Code Online (Sandbox Code Playgroud)
,在C中是不允许的.
同样,我的问题实际上是在第5个子弹(要求).
有没有办法在 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 的新手,所以也许这完全没有必要。也许有一个图书馆可以做这种事情?
任何意见是极大的赞赏。提前致谢!
Peter Norvig 曾说过,许多 OOP 设计模式在 Lisp 中都是微不足道或多余的。这里的幻灯片 #10声称一流类型取代了其中的许多类型。
在什么意义上,Common Lisp 中的类型是一流的?作为参考,《计算机程序的结构和解释》给出了以下编程语言元素必须满足的条件才能被视为一流:
它们可以通过变量命名。
它们可以作为参数传递给过程。
它们可以作为程序的结果返回。
它们可能包含在数据结构中
证明 Common Lisp 中的类型满足上述条件将是一个很好的答案。
我有几个模块实现相同的接口.我想根据命令行中给出的一个参数只加载该模块中的一个.
我在考虑使用一流的模块,但问题是我想在模块实例化之前执行一些功能.
目前我有这个:
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给我空字符串.
我想在执行此函数之前实现命令行解析(不在函数中添加解析).可能吗 ?我应该找到另一种方法来实现这一目标吗?
由于类型在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功能?或者是否有一些更为微妙的关于"获取价值类型"的想法,这是我想要的,这会阻止这种功能的存在?
我希望能够根据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名称关联,并使用我给出的"名称"来实例化这些类?
我正在试验警报,但警报不起作用,因为我预期看到下面的线条:
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(){})
我非常好奇也很困惑!谢谢!
first-class ×10
java ×3
c# ×2
function ×2
types ×2
alert ×1
class ×1
command-line ×1
common-lisp ×1
dictionary ×1
elixir ×1
erlang ×1
idris ×1
javascript ×1
module ×1
ocaml ×1
oop ×1
primitive ×1
scala ×1