标签: pass-by-name

什么是"名字传递",它是如何运作的?

我已经检查了维基百科,然后用Google搜索,但我还是无法理解ALGOL 60中的名称传递方式.

history parameter-passing pass-by-name algol

35
推荐指数
2
解决办法
5万
查看次数

Python:按名称和kwargs传递参数

在python中我们可以这样做:

def myFun1(one = '1', two = '2'):
    ...
Run Code Online (Sandbox Code Playgroud)

然后我们可以调用函数并按名称传递参数:

myFun1(two = 'two', one = 'one')
Run Code Online (Sandbox Code Playgroud)

此外,我们可以这样做:

def myFun2(**kwargs):
    print kwargs.get('one', 'nothing here')

myFun2(one='one')
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否可以将两种方法结合起来:

def myFun3(name, lname, **other_info):
    ...

myFun3(lname='Someone', name='myName', city='cityName', otherInfo='blah')
Run Code Online (Sandbox Code Playgroud)

一般来说,我们可以做什么组合?

谢谢,对不起我的愚蠢问题.

python arguments function pass-by-name kwargs

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

仅在C++中使用堆栈的后果

让我们说我认识一个不熟悉C++的人.他没有绕过指针(正确地说是这样),但他拒绝通过引用传递.他总是使用传值.原因是他觉得"通过引用传递物体是一种破碎设计的标志".

该程序是一个小型图形程序,大多数传递的问题是数学Vector(3元组)对象.有一些大的控制器对象,但没有比这复杂.

我发现很难找到一个反对只使用堆栈的杀手论点.

我认为按值传递对于诸如向量之类的小对象是好的,但即使这样,代码中也会发生许多不必要的复制.按值传递大型对象显然是浪费,很可能不是您想要的功能.

在专业方面,我相信堆栈在分配/解除分配内存方面更快,并且具有恒定的分配时间.

我能想到的唯一主要论点是堆栈可能会溢出,但我猜这是不可能发生的?是否有任何其他参数反对仅使用堆栈/传递值而不是通过引用传递?

c++ pass-by-reference pass-by-name

17
推荐指数
5
解决办法
1623
查看次数

为什么Scala在使用by-name参数重载的情况下的行为与使用by-value参数的情况不同?

鉴于此Scala代码:

object test {

  def byval(a: Int) = println("Int")
  def byval(a: Long) = println("Long")

  def byname(a: => Int) = println("=> Int")
  def byname(a: => Long) = println("=> Long")

  def main(args: Array[String]) {
      byval(5)
      byname(5)
  }
}
Run Code Online (Sandbox Code Playgroud)

调用byval(5)正确编译,但byname无法编译:

ambiguous reference to overloaded definition
Run Code Online (Sandbox Code Playgroud)

为什么?我希望在重载方面观察相同的by-value和by-name参数行为......如何修复它?

scala overloading pass-by-name

9
推荐指数
2
解决办法
412
查看次数

按引用,值和名称调用

我试图理解按引用,值和名称调用之间的概念差异.

所以我有以下伪代码:

foo(a, b, c)
{
   b =b++;
   a = a++;
   c = a + b*10
}

X=1;
Y=2;
Z=3;
foo(X, Y+2, Z);
Run Code Online (Sandbox Code Playgroud)

如果a,b和c都是通过引用调用的话,foo调用后的X,Y和Z是什么?如果a,b和c是按值调用/结果?如果a,b和c是名字?

另一种情况:

X=1;
Y=2;
Z=3;
foo(X, Y+2, X);
Run Code Online (Sandbox Code Playgroud)

我正在努力开始研究即将到来的决赛,这似乎是一个很好的评论问题.名字传递对我来说绝对是最陌生的.

pass-by-reference pass-by-value pass-by-name

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

A => => B是什么意思?

另一个问题中,我最终得到了一个类型的值A => => B.这是什么意思?

我总是被理解=> A为实际上并不是一个类型,但是可以声明一个参数可以用于逐个语调的语义.但如果它不是一种类型,那A => => B意味着什么?

scala pass-by-name

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

按名称类型参数

想象一下,我有以下类定义:

class Foo[T]
Run Code Online (Sandbox Code Playgroud)

我想做以下事情

def bar(x:Foo[ =>Int ]):Int = ???
Run Code Online (Sandbox Code Playgroud)

但编译器失败,"此处不允许使用by-name参数类型"

如何使用通配名类型作为通用方法的类型参数?

scala pass-by-name

5
推荐指数
1
解决办法
830
查看次数

在DSL中隐藏和确定隐式变量创建

在开发DSL时,限制隐式变量范围的最简洁方法是什么,同时隐藏这样一个隐式变量定义的事实?

举个例子,这是理想的行为......

object External
{
    def funNeedingValue(implicit a : String)
    {
        println(a)
    }
}

object Main extends App
{
    useValue("Hi") {
        // Implicit string "Hi" is only defined in this block
        External.funNeedingValue // Prints "Hi"
    }

    External.funNeedingValue // Compilation error: No implicit String defined
}
Run Code Online (Sandbox Code Playgroud)

以下是关闭,但没有所有所需的属性......

// The following works, but does not hide the fact that there is an implicit  
// variable defined.

object Main extends App
{
    {
        implicit val implicitValue = "Hi"
        External.funNeedingValue // Prints "Hi"
    } …
Run Code Online (Sandbox Code Playgroud)

scope scala implicit pass-by-name

5
推荐指数
1
解决办法
264
查看次数

使用Scala按名称参数

我正在阅读"Scala中的函数编程"一书,并且遇到了一个我不完全理解的例子.

在关于严格/懒惰的章节中,作者描述了Streams的构造,并且代码如下:

sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]

object Stream {
    def cons[A](hd: => A, tl: => Stream[A]) : Stream[A] = {
        lazy val head = hd
        lazy val tail = tl
        Cons(() => head, () => tail)
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是在smart constructor(cons)中,它调用Conscase类的构造函数.用于传递headtailval 的特定语法对我来说没有意义.为什么不像这样调用构造函数:

Cons(head, tail)
Run Code Online (Sandbox Code Playgroud)

据我所知,它使用的语法是强制创建两个只返回headtailval的Function0对象.这与仅仅传递headtail …

scala pass-by-name

5
推荐指数
2
解决办法
788
查看次数

如何将do-nothing处理程序设置为by-name参数?

我定义了一个treeNode创建节点的方法,它可以有子节点.简化的代码是:

def treeNode(text:String) (children: => Any) {
    val b = new TreeNode(text)
    children
}
Run Code Online (Sandbox Code Playgroud)

当我使用这种方法时,我必须写:

treeNode("aaa") {
    treeNode("bbb") {}
    treeNode("ccc") {}
}
Run Code Online (Sandbox Code Playgroud)

您可以看到他们没有子节点的叶节点,但它们必须有一个空块{}.

有没有办法给参数children: => Any一个默认的do-nothing值,我可以把代码编写为:

treeNode("aaa") {
    treeNode("bbb")
    treeNode("ccc")
}
Run Code Online (Sandbox Code Playgroud)

帮助〜

scala pass-by-name

4
推荐指数
2
解决办法
200
查看次数