首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"let ()=“和"let _=”有什么区别;

"let ()=“和"let _=”有什么区别;
EN

Stack Overflow用户
提问于 2012-07-17 10:25:29
回答 2查看 4K关注 0票数 13
代码语言:javascript
复制
let () = Random.self_init();;
let _ = Random.self_init ();;
│- : unit = ()

似乎"let ()“什么也不返回?

真心的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-17 15:27:01

let是用于定义新变量的关键字,如以下结构所示:

代码语言:javascript
复制
let pattern = expr

例如

代码语言:javascript
复制
let a = 2

为名称a指定值2。(请注意,这不是为已存在的变量赋值的方法,但这是另一个主题)。

但是,=标志左侧的模式可能不仅仅是一个名称。例如

代码语言:javascript
复制
let (a,b) = (42,"foo")

定义ab,分别为42"foo"。当然,两端的类型必须匹配。这里就是这种情况:两端都是int * string类型。

例如,也可以详细说明=符号右侧的表达式

代码语言:javascript
复制
let foo =
  let temp = String.make 10 'a' in
  temp.[2] <- 'b';
  temp

foo定义为字符串"aabaaaaaaa"。(顺便说一句,它还确保了temp对于此代码片段是本地的)。

现在,让我们两者都使用:左边是一个匹配unit类型的值的模式,右边是一个unit类型的表达式

代码语言:javascript
复制
let () = Printf.printf "Hello world!\n"

这解释了let () =构造。现在,关于let _,人们只需要知道_可以在模式中作为通配符使用:它匹配任何类型的值,并且不绑定任何名称。例如

代码语言:javascript
复制
let (a,_) = (42,"foo")

a定义为42,并丢弃值"foo"_的意思是“我知道这里有一些东西,我明确地说我不会使用它,所以我不给它命名”。这里使用了_来匹配string类型的值,但它可以匹配任何类型的值,比如int * string

代码语言:javascript
复制
let _ = (42,"foo")

它没有定义任何变量,也不是很有用。当右侧有副作用时,这样的构造很有用,如下所示:

代码语言:javascript
复制
let _ = Printf.printf "Hello world!\n"

这就解释了问题的第二部分。

实用目的

这两个都使用了,这是一个品味的问题,是使用一个还是另一个。

let () =稍微安全一些,因为它让编译器检查右边是不是unit类型。除单位以外的任何其他类型的值通常都是错误的。

let _ =稍微短一些(我见过这种说法)。(请注意,使用自动关闭括号的编辑器,击键次数是相同的;-)

票数 24
EN

Stack Overflow用户

发布于 2012-07-17 11:31:34

我不是OCaml专家,尽管让我分享一些东西:)

OCaml中的let可以表示两件事:

  1. 赋值变量的方式;
  2. 声明函数或将函数赋值给名称的方式;

通过示例,您可以清楚地看到它是如何工作的:赋值变量:

代码语言:javascript
复制
# let ten = 10;;
val ten : int = 10

# let hello_world_string = "Hello World";;
val hello_world_string : string = "Hello World"

声明函数:

代码语言:javascript
复制
# let sum a b = a+b;;
val sum : int -> int -> int = <fun>
# sum 2 3;;
- : int = 5

因此,在回答这个问题时,let ()=和let _=之间的区别是:

在第一个示例中,您声明了一个没有名称、参数和指令的函数,该函数应该输出一个单元。第二个例子,你没有赋值给_,这是OCaml的通配符,任何值。

正如我们在下面看到的,我们可以定义一个函数,该函数将立即执行,因为我们将无法再调用它:

代码语言:javascript
复制
# let () = print_string "Hello";;
Hello

或者为OCaml的通配符分配一个类型和值,或者一个函数:

代码语言:javascript
复制
# let _ = 10;;
- : int = 10
# let _ = print_string "Maybe I answered your question :) ";;
Maybe I answered your question :) - : unit = ()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11515240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档