Java充斥着如下语句:
if(cage.getChicken() != null) {
dinner = cage.getChicken();
} else {
dinner = getFreeRangeChicken();
}
Run Code Online (Sandbox Code Playgroud)
getChicken()在返回的对象可以分配之前需要两次调用dinner.
这也可以写成一行,如下所示:
dinner = cage.getChicken() != null? cage.getChicken() : getFreeRangeChicken();
Run Code Online (Sandbox Code Playgroud)
但唉,还有两个电话getChicken().
当然我们可以分配一个局部变量,然后再次使用三元运算符来分配它,如果它不是null,但这是两行而不是那么漂亮:
FutureMeal chicken = cage.getChicken();
dinner = chicken != null? chicken : getFreeRangeChicken();
Run Code Online (Sandbox Code Playgroud)
那么有什么方法可以说:
变量var =某些值,如果某个值不为null或其他值;
我想我只是在这里讨论语法,在编译代码之后,它可能没有太大的区别代码是如何在性能意义上编写的.
因为这是一个很常见的代码,所以有一个单行写入它会很棒.
是否有其他语言有此功能?
我正在Eclipse中开发一个Java项目.有时当我进行重构时,我希望从其他类中看到一个公共方法被调用.
有一种原始的方法可以做到这一点,我现在正在使用它.我可以注释掉该方法,并查看Eclipse中哪些类存在错误.在Eclipse中有没有更好的方法呢?例如,通过选择方法签名并通过键快捷键运行命令?
我开始注意到,当我在C#中进行方法调用时,我调用的方法的参数名称将显示在附加冒号的intellisense列表中,然后我可以格式化该方法这样打电话:
MethodCall(parameter1:value1, parameter2:value2);
Run Code Online (Sandbox Code Playgroud)
这是一种新的语言功能吗?它让我想起了在SQL中调用存储过程的方式,并指定参数名称,如下所示:
spDoSomeStuff @param1 = 1, @param2 = 'other param'
Run Code Online (Sandbox Code Playgroud)
这是一个类似的功能吗?如果是这样,到底是什么?如果没有,它是什么以及它用于什么.
出于好奇:CLR如何调度虚拟方法调用接口成员到正确的实现?
我知道CLR为每种类型维护的VTable,每个方法都有方法槽,并且每个接口都有一个额外的方法槽列表,指向相关的接口方法实现.但我不明白以下内容:CLR如何有效地确定从类型的VTable中选择哪个接口方法槽列表?
从2005年5月刊的MSDN杂志中了解CLR如何创建运行时对象的文章Dril Into .NET Framework Internals讨论了由接口ID索引的进程级映射表IVMap.这是否意味着同一进程中的所有类型都具有指向同一IVMap的相同指针?
它还指出:
如果
MyInterface1由两个类实现,则IVMap表中将有两个条目.该条目将指回嵌入在MyClass方法表中的子表的开头.
CLR如何知道要选择哪个条目?它是否进行线性搜索以查找与当前类型匹配的条目?还是二元搜索?或者某种直接索引并且有一个可能有很多空条目的地图?
我还通过C#第3版阅读了CLR中的接口章节,但它没有谈到这一点.因此,这个问题的答案没有回答我的问题.
假设我有以下内容
Class A {
Foo getFoo();
Bar getBar();
Baz getBaz();
}
Run Code Online (Sandbox Code Playgroud)
我需要定义一个函数doStuff使用Foo,Bar,Baz的一个对象,并做一些事情
我正在努力实现哪种方法doStuff更好(假设它不适合放在doStuff类中A)
方法A.
void doStuff(Foo foo, Bar bar, Baz baz)
{
//some operation
}
Run Code Online (Sandbox Code Playgroud)
要么
方法B.
void doStuff(A a)
{
Foo foo = a.getFoo();
Bar bar = a.getBar();
Baz baz = a.getBaz();
//some operation
}
Run Code Online (Sandbox Code Playgroud)
据我所知,(+专业, - 缺点)
方法A.
+很清楚究竟有哪些参数可以doStuff()运行
- 易受长参数列表的影响,更容易受到用户错误的影响
方法B.
+简单易用的方法
+似乎更具可扩展性(?)
- 对课堂不必要的依赖 A
任何人都可以分享对这两种方法的利弊的额外见解吗?
我希望这个标题能够真正描述我想要问的内容......
我编写了一段代码,用gcc编译并按照我的意图工作.但是,它不使用llvm编译,并且在使用icc编译时代码执行方式不同!
以下是问题的示例:
#include <iostream>
using std::cout; using std::endl;
class A {
public:
virtual void foo() { cout << "A::foo()" << endl; }
};
class B : public A {
public:
typedef A base;
virtual void foo() { cout << "B::foo()" << endl; }
};
int main() {
typedef B base;
base* bp = new B();
bp->base::foo();
}
Run Code Online (Sandbox Code Playgroud)
gcc输出:A :: foo()
icc输出:B :: foo()
有人可以解释标准对这个案子的看法吗?
假设我有一个Java对象,其中包括以下方法:
public String getField1();
public String getField2();
public String getField3();
public String getField4();
public String getField5();
Run Code Online (Sandbox Code Playgroud)
有没有办法迭代这些方法并像下面的代码一样调用它们?
String fields = "";
for(int i = 1; i <= 5; i ++){
fields += object.(getField+i) + " | ";
}
Run Code Online (Sandbox Code Playgroud)
感谢您即将到来的想法.
Perl有一个名为像文件句柄字符串被带到特征是一个文件句柄:
# let this be some nice class I wrote
package Input {
sub awesome { ... }
}
Run Code Online (Sandbox Code Playgroud)
因此,当我们做Input->awesome或非常小心:'Input'->awesome,该方法将被调用.除非:
# now somewhere far, far away, in package main, somebody does this:
open Input, "<&", \*STDIN or die $!; # normally we'd open to a file
Run Code Online (Sandbox Code Playgroud)
甚至不必执行此代码,但只有解析器才能看到此代码,以便Perl 'Input'从现在开始将字符串解释为文件句柄.因此,方法调用'Input'->awesome将会死亡,因为表示文件句柄的对象没有很棒的方法.
由于我只控制着我的班级而不是其他代码,我不能简单地决定只在每个地方使用词法文件句柄.
有什么方法可以强制我Input->awesome永远是一个方法调用Input包,但从来没有文件句柄(至少在我控制的范围内)?我认为不应该有任何名称冲突,因为Input包实际上是%Input::藏匿.
完整代码重现问题(另请参阅此ideone):
use strict;
use warnings;
use feature 'say';
say "This is …Run Code Online (Sandbox Code Playgroud) 在 JavaScript 中,通过在全局范围内使用堆栈,可以轻松地将某些上下文与同步函数调用相关联。
// Context management
let contextStack = [];
let context;
const withContext = (ctx, func) => {
contextStack.push(ctx);
context = ctx;
try {
return func();
} finally {
context = contextStack.pop();
}
};
// Example
const foo = (message) => {
console.log(message);
console.log(context);
};
const bar = () => {
withContext("calling from bar", () => foo("hello"));
};
bar();Run Code Online (Sandbox Code Playgroud)
这允许我们编写特定于上下文的代码,而不必到处传递上下文对象,并且我们使用的每个函数都依赖于该上下文对象。
这在 JavaScript 中是可能的,因为保证了顺序代码执行,也就是说,这些同步函数在任何其他代码可以修改全局状态之前运行完成。
我们可以使用生成器函数实现类似的功能。生成器函数使我们有机会在生成器函数的概念执行恢复之前进行控制。这意味着,即使执行暂停几秒钟(即,该函数在任何其他代码运行之前都没有运行完成),我们仍然可以确保其执行附加了准确的上下文。
const iterWithContext = function* (ctx, generator) {
// not a perfect implementation
let …Run Code Online (Sandbox Code Playgroud) 现在,我的代码看起来像这样:
Private Sub ShowReport(ByVal reportName As String)
Select Case reportName
Case "Security"
Me.ShowSecurityReport()
Case "Configuration"
Me.ShowConfigurationReport()
Case "RoleUsers"
Me.ShowRoleUsersReport()
Case Else
pnlMessage.Visible = True
litMessage.Text = "The report name """ + reportName + """ is invalid."
End Select
End Sub
Run Code Online (Sandbox Code Playgroud)
有没有办法创建使用我的方法命名约定来简化事情的代码?这是一些描述我正在寻找的伪代码:
Private Sub ShowReport(ByVal reportName As String)
Try
Call("Show" + reportName + "Report")
Catch ex As Exception
'method not found
End Try
End Sub
Run Code Online (Sandbox Code Playgroud) method-call ×10
java ×3
c# ×2
.net ×1
ambiguity ×1
async-await ×1
c++ ×1
call ×1
clr ×1
dispatch ×1
eclipse ×1
filehandle ×1
interface ×1
javascript ×1
methods ×1
null ×1
parameters ×1
perl ×1
scope ×1
syntax ×1
types ×1
vb.net ×1