标签: argument-passing

为什么列表在没有引用的情况下传递给一个像ref一样传递的函数?

如果我没有得到这个非常错误,这种行为对我来说很奇怪.而不是解释,我将在下面发布一个示例代码,请告诉我为什么我得到输出x而不是y.

    private void button1_Click(object sender, EventArgs e)
    {
        List<int> l = new List<int>() { 1, 2, 3 };
        Fuss(l);
        MessageBox.Show(l.Count.ToString());
    }

    private void Fuss(List<int> l)
    {
        l.Add(4);
        l.Add(5);
    }
Run Code Online (Sandbox Code Playgroud)

输出应该,我假设是3.但我得到输出为5.我理解输出可以是5如果我这样做:

    private void button1_Click(object sender, EventArgs e)
    {
        List<int> l = new List<int>() { 1, 2, 3 };
        Fuss(ref l);
        MessageBox.Show(l.Count.ToString());
    }

    private void Fuss(ref List<int> l)
    {
        l.Add(4);
        l.Add(5);
    }
Run Code Online (Sandbox Code Playgroud)

c# ref argument-passing c#-4.0

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

一个好的C++编译器会优化参考吗?

我想写一个模板函数,它与a std::stack<T>和一个实例做一些事情T,例如:

template<class StackType> inline
bool some_func( StackType const &s, typename StackType::value_type const &v ) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我通过v引用传递的原因当然是针对StackType::value_typea struct或者class不按值复制整个对象的情况进行优化.

但是,如果它StackType::value_type是一个"简单"类型int,那么它当然更简单地通过值传递它.

的问题是:对于一个类型,如int,将成为int const&作为一个正式的参数在上面的功能,将编译器优化掉参考和简单地通过值传递呢?

c++ optimization templates argument-passing

14
推荐指数
3
解决办法
2771
查看次数

C函数调用参数太少

我正在研究一些遗留的C代码.原始代码是在90年代中期编写的,目标是那个时代的Solaris和Sun的C编译器.当前版本在GCC 4下编译(虽然有许多警告),它似乎有效,但我正在努力整理它 - 我想尽可能多地挤出潜在的错误,因为我确定了可能需要的东西.使其适应64位平台,以及编译器以外的编译器.

我在这方面的主要活动之一是确保所有函数都有完整的原型(许多人都没有),在这种情况下我发现了一些调用函数(以前没有原型)的代码,其参数少于函数定义声明.函数实现确实使用了缺少参数的值.

例:

impl.c:

int foo(int one, int two) {
  if (two) {
      return one;
  } else {
      return one + 1;
  }
}
Run Code Online (Sandbox Code Playgroud)

client1.c:

extern foo();
int bar() {
  /* only one argument(!): */
  return foo(42);
}
Run Code Online (Sandbox Code Playgroud)

client2.c:

extern int foo();
int (*foop)() = foo;
int baz() {
  /* calls the same function as does bar(), but with two arguments: */
  return (*foop)(17, 23);
}
Run Code Online (Sandbox Code Playgroud)

问题:是否定义了缺少参数的函数调用的结果?如果是这样,函数将为未指定的参数接收什么值?否则,Sun C编译器的ca. 1996年(对于Solaris,而不是VMS)展示了一种可预测的特定于实现的行为,我可以通过向受影响的调用添加特定的参数值来模拟这种行为吗?

c argument-passing

14
推荐指数
1
解决办法
6397
查看次数

PHP:传递匿名函数作为参数

是否可以将匿名函数作为参数传递,并让它立即执行,从而传递函数的return值?

function myFunction(Array $data){
    print_r($data);
}

myFunction(function(){
    $data = array(
        'fruit'     => 'apple',
        'vegetable' => 'broccoli',
        'other'     => 'canned soup');
    return $data;
});
Run Code Online (Sandbox Code Playgroud)

这会因Array类型提示而引发错误,抱怨传递的对象.好吧,如果我删除类型提示,它当然会吐出Closure Object,而不是我想要的结果.我明白,我在技术上合格的对象实例ClosuremyFunction,不过,我一定附近,我已经看到了这个在其他地方完成.这可能吗?如果是这样,我做错了什么?

为了便于讨论,我无法修改我传递闭包的函数.

tl; dr:如何将匿名函数声明作为参数传递,从而导致返回值作为参数传递.

PS:如果不清楚,所需的输出是:

Array
(
    [fruit] => apple
    [vegetable] => broccoli
    [other] => canned soup
)
Run Code Online (Sandbox Code Playgroud)

php closures anonymous-function argument-passing

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

Clojure关键字和可选参数问题

我想创建一个函数,它接受一个必需的参数x,以及一个可选参数opt1或一个关键字参数opt2.

现在我有

(defn foo x & [opt1 {:keys [opt2]}]
  ...
Run Code Online (Sandbox Code Playgroud)

但是当x和opt1都存在时,上面的签名只允许我传入关键字参数opt2

(foo 'x 'opt1 {:opt2 'opt2})
Run Code Online (Sandbox Code Playgroud)

不喜欢这个

(foo 'x {:opt2 'opt2})
Run Code Online (Sandbox Code Playgroud)

请帮我创建一个带有必需参数X和opt1或opt2的函数,其中opt2是关键字参数.

谢谢.

编辑:我也想对其他宏做同样的事情.所以我仍然需要使用defmacro.

clojure optional-parameters argument-passing

11
推荐指数
1
解决办法
8881
查看次数

如果我没有指定<programfile>,如何将<arguments>传递给IRB?

以来:

irb --help
Run Code Online (Sandbox Code Playgroud)

用法:irb.rb [options] [programfile] [参数]


我知道如果我包含一个程序文件,我可以将参数传递给ARGV

例如:

irb test.rb A B C
Run Code Online (Sandbox Code Playgroud)

test.irb只是"p ARGV"

生产:

["a","b","c"]


使程序文件成为DOS 中的con ...我可以做以下

irb con A B C
con(main):001:0> ARGV
Run Code Online (Sandbox Code Playgroud)

生产:

ARGV
=> ["A","B","C"]

但这是系统依赖的,并具有回声输入的副作用:-(

我真正喜欢的是类似的东西

irb -- a b c
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我知道我可以在irb中设置ARGV,但我的意图是别名== irb -rSpecialLibrary"所以我可以这样做:

special A B C
<input goes here>
Run Code Online (Sandbox Code Playgroud)

有什么建议?

ruby irb argument-passing

11
推荐指数
2
解决办法
4106
查看次数

如何创建一个从管道和命令行接受多个参数类型的函数?

我正在尝试编写一个带有多个参数的函数,这些函数可以来自命令行,也可以来自管道.参数可以是字符串或目录对象.这个想法是以下任何调用应该工作:

Test-VEnv '.\MyPath', '.\AnotherPath'
Test-VEnv (dir)
'MyPath', 'AnotherPath' | Test-VEnv
dir | Test-VEnv
Run Code Online (Sandbox Code Playgroud)

以下代码几乎可以工作:

function Test-VEnv {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true, Position=0,
            ValueFromPipeline=$True,
            ValueFromPipelineByPropertyName=$true)]
        [Alias('FullName')]
        [String[]]$Path
    )

    process {
        foreach ($P in $Path) {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它处理来自管道和命令参数的字符串,并处理来自管道的目录对象(通过ValueFromPipelineByPropertyName和FullName别名).但它不会在命令行上处理目录对象,所以

dir | Where-Object { Test-VEnv $_ }
Run Code Online (Sandbox Code Playgroud)

失败,因为它将目录对象转换为字符串,使用Name属性而不是FullName,后续代码失败.

有谁能告诉我如何实现我想要的?

我知道即使我可以让它工作,它可能不是一个特别好的设计.但据我所知,这就是内置的Test-Path的工作方式,所以我想在发明自己之前尝试遵循标准行为......

powershell arguments argument-passing

11
推荐指数
2
解决办法
8396
查看次数

推广`...`(三个点)参数dispatch:参数集的S4方法包括`...`

实际问题

是否可以为一组包含 ...(而不是专门用于...)的签名参数定义方法?这是不可能的"开箱即用",但理论上它是否可能(涉及一些调整)或者由于S4机制的设计方式,这是不能完成的事情?

我正在寻找一些类似的东西

setGeneric(
  name = "foo",
  signature = c("x", "..."),
  def = function(x, ...) standardGeneric("foo")      
)
setMethod(
  f = "foo", 
  signature = signature(x = "character", "..." = "ThreedotsRelevantForMe"), 
 definition = function(x, ...) bar(x = x)
)
Run Code Online (Sandbox Code Playgroud)

谢天谢地,马丁摩根指出了我dotsMethods,它说:

目前,"..."不能与其他形式参数混合:通用函数的签名只是"...",或者它不包含"......".(此限制可能会在将来的版本中解除.)

背景

考虑以下尝试来概括基于...简单情况的调度机制(只有一个函数应该使用传递的参数...;例如使用...in plot()来传递参数par())到涉及以下方面的场景(取自此处):

  • 当你想将参数传递给多个,因此r,接收者,
  • 当这些收件人可以位于c 调用堆栈的不同层上时
  • 当他们甚至可能使用相同的参数名称,但在他们自己的范围/闭包/框架/环境中将不同的含义与这些参数联系起来

另请注意,尽管这样做确实是一种好习惯,但 …

r argument-passing dispatch s4

11
推荐指数
1
解决办法
619
查看次数

C++:如何将引用函数传递给另一个函数?

我一直在阅读函数指针以及将它们用作其他函数的参数.我的问题是如何在不使用指针的情况下通过引用传递函数?我一直试图在互联网上找到答案,但我没有找到一个好的答案.我知道您可以通过引用传递变量,如下所示: void funct(int& anInt);.你会如何做与此类似的事情,但是对一个变量的引用而不是对函数的引用是参数?另外,如何在函数体中使用函数的引用?

c++ function pass-by-reference argument-passing

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

通过ref传递实现:无法从'Foo'转换为'ref IFoo'

有人可以向我解释为什么在C#中这是不正确的:

namespace NamespaceA
{
    public class ClassA
    {
        public interface IInterfaceA
        {
            String Property
            {
                set;
            }
        }
    }
}

namespace NamespaceB
{
    public class ClassB
    {
        public class ImpA: NamespaceA.ClassA.IInterfaceA
        {
            private String mProperty;
            public String Property{ set{ mProperty = value; } }
        }
        public ClassB()
        {
            ImpA aImpA = new ImpA();
            foo(ref aImpA);
        }

        private void foo(ref NamespaceA.ClassA.IInterfaceA aIInterfaceA)
        {
            aIInterfaceA.Property = "SomeValue";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将产生一个编译错误:

错误参数1:无法从'NamespaceB.ClassB.ImpA'转换为'ref NamespaceA.ClassA.IInterfaceA'

想要修改接口属性并调用接口函数似乎是完全合理的foo().如果您删除ref关键字,它会进行编译,但您所做的更改foo()会丢失...

c# interface reference argument-passing

10
推荐指数
2
解决办法
7147
查看次数