如果我没有得到这个非常错误,这种行为对我来说很奇怪.而不是解释,我将在下面发布一个示例代码,请告诉我为什么我得到输出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) 我想写一个模板函数,它与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代码.原始代码是在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)展示了一种可预测的特定于实现的行为,我可以通过向受影响的调用添加特定的参数值来模拟这种行为吗?
是否可以将匿名函数作为参数传递,并让它立即执行,从而传递函数的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,而不是我想要的结果.我明白,我在技术上合格的对象实例Closure来myFunction,不过,我一定附近,我已经看到了这个在其他地方完成.这可能吗?如果是这样,我做错了什么?
为了便于讨论,我无法修改我传递闭包的函数.
tl; dr:如何将匿名函数声明作为参数传递,从而导致返回值作为参数传递.
PS:如果不清楚,所需的输出是:
Array
(
[fruit] => apple
[vegetable] => broccoli
[other] => canned soup
)
Run Code Online (Sandbox Code Playgroud) 我想创建一个函数,它接受一个必需的参数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.
以来:
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)
有什么建议?
我正在尝试编写一个带有多个参数的函数,这些函数可以来自命令行,也可以来自管道.参数可以是字符串或目录对象.这个想法是以下任何调用应该工作:
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的工作方式,所以我想在发明自己之前尝试遵循标准行为......
是否可以为一组包含 ...(而不是专门用于...)的签名参数定义方法?这是不可能的"开箱即用",但理论上它是否可能(涉及一些调整)或者由于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 调用堆栈的不同层上时另请注意,尽管这样做确实是一种好习惯,但 …
我一直在阅读函数指针以及将它们用作其他函数的参数.我的问题是如何在不使用指针的情况下通过引用传递函数?我一直试图在互联网上找到答案,但我没有找到一个好的答案.我知道您可以通过引用传递变量,如下所示: void funct(int& anInt);.你会如何做与此类似的事情,但是对一个变量的引用而不是对函数的引用是参数?另外,如何在函数体中使用函数的引用?
有人可以向我解释为什么在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()会丢失...