是否可以在过程/函数中获取当前过程/函数的名称作为字符串?我想在编译时会有一些"宏"扩展.
我的情况是这样的:我有很多程序被给予记录,他们都需要从检查记录的有效性开始,因此他们将记录传递给"验证程序".如果记录无效,验证程序(所有程序都是同一个程序)会引发异常,并且我希望异常的消息不包括验证程序的名称,而是包含调用验证程序的函数/过程的名称程序(自然地).
就是,我有
procedure ValidateStruct(const Struct: TMyStruct; const Sender: string);
begin
if <StructIsInvalid> then
raise Exception.Create(Sender + ': Structure is invalid.');
end;
Run Code Online (Sandbox Code Playgroud)
然后
procedure SomeProc1(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProc1');
...
end;
...
procedure SomeProcN(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProcN');
...
end;
Run Code Online (Sandbox Code Playgroud)
如果我可以写出类似的内容,那么它会更容易出错
procedure SomeProc1(const Struct: TMyStruct);
begin
ValidateStruct(Struct, {$PROCNAME});
...
end;
...
procedure SomeProcN(const Struct: TMyStruct);
begin
ValidateStruct(Struct, {$PROCNAME});
...
end;
Run Code Online (Sandbox Code Playgroud)
然后每次编译器遇到{$ PROCNAME}时,它只是将当前函数/过程的名称替换为"宏"作为字符串文字.
更新
第一种方法的问题在于它容易出错.例如,由于复制粘贴,你很容易弄错:
procedure SomeProc3(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProc1');
...
end;
Run Code Online (Sandbox Code Playgroud)
或错别字:
procedure SomeProc3(const Struct: TMyStruct); …Run Code Online (Sandbox Code Playgroud) 我有一定数量的div框,它们都有相同的类名.我试图向他们申请一些东西,但没有运气.我到目前为止构建的代码是
$(document).ready(function(){
elements = $('div.easy_editor');
elements.each(function() { $(this).css("border","9px solid red"); });
//elements[0].css("border","9px solid red");
});
Run Code Online (Sandbox Code Playgroud)
你能告诉我我做错了吗?
这是一个两部分问题.有一天有人回答了类似的问题(其中也包含有关PHP中此类数组的信息),但我找不到它.
1.)首先,在表单中输入标记的name元素末尾创建的数组的正确术语是什么?
<form>
<input name="p_id[]" value="0"/>
<input name="p_id[]" value="1"/>
<input name="p_id[]" value="2"/>
</form>
Run Code Online (Sandbox Code Playgroud)
2.)如何使用JavaScript从该数组中获取信息?具体来说,我现在只想计算数组的元素.这是我做的,但它不起作用.
function form_check(){
for(var i = 0; i < count(document.form.p_id[]); i++){ //Error on this line
if (document.form.p_name[i].value == ''){
window.alert('Name Message');
document.form.p_name[i].focus();
break;
}
else{
if (document.form.p_price[i].value == ''){
window.alert('Price Message');
document.form.p_price[i].focus();
break;
}
else{
update_confirmation();
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 大多数语言都使用true/false关键字作为布尔值.我发现即使是Smalltalk也在使用true/false.我知道Objective-C只是借用Smalltalk的概念,而不是语言本身,但我很好奇为什么它使用YES/NO而不是更广泛使用true/false.有历史原因吗?
就变量命名约定而言,是应该命名迭代器i还是更像语义的东西count?如果你不使用i,为什么不呢?如果您认为这i是可以接受的,是否存在不应该使用迭代的情况?
在Objective-C程序中的函数名称接口声明之前,"+"和" - "之间有什么区别.例:
- (void)continueSpeaking;
+ (NSArray *)availableVoices;
Run Code Online (Sandbox Code Playgroud)
有什么不同?
每次关闭Bash会话时我都想运行一个脚本.
我使用XFCE和终端0.4.5(Xfce终端仿真器),我想在每次关闭终端中的一个选项卡时运行一个脚本,包括最后一个(当我关闭终端时).
像.bashrc之类的东西,但在每个会话结束时运行.
.bash_logout不起作用
我有一些自定义日志功能是扩展的cat.一个基本的例子是这样的:
catt<-function(..., file = "", sep = " ", fill = FALSE, labels = NULL,
append = FALSE)
{
cat(..., format(Sys.time(), "(%Y-%m-%d %H:%M:%S)"), "\n", file = file,
sep = sep, fill = fill, labels = labels, append = append)
}
Run Code Online (Sandbox Code Playgroud)
现在,我使用(自制)函数进行了大量工作,并使用其中一些logfuntions来查看进度,这非常有效.但是,我注意到,我几乎总是使用这样的函数:
somefunc<-function(blabla)
{
catt("somefunc: start")
#do some very useful stuff here
catt("somefunc: some time later")
#even more useful stuff
catt("somefunc: the end")
}
Run Code Online (Sandbox Code Playgroud)
注意每个调用如何catt从调用它的函数的名称开始.非常整洁,直到我开始重构我的代码并重命名函数等.
感谢Brian Ripley的一些旧的R-list帖子,如果我没弄错的话,我发现这段代码可以获得'当前的函数名':
catw<-function(..., file = "", sep = " ", fill = …Run Code Online (Sandbox Code Playgroud) 为什么有一个被调用的函数strcat而不是一个被调用的函数stringConcatenation,或者stringConcat或者string_concat类似的函数?为什么有一个clrscr功能,而不是clearScreen或clear_screen?
它是否与过去几天的源代码大小有关,其中每个字节在过大的软盘上都是值得的?还是程序员固有的懒惰加剧了这种情况?这是一个惯例吗?
我想动态地将类atttributes添加到超类.此外,我想创建动态继承自这个超类的类,这些子类的名称应该取决于用户输入.
有一个超类"单元",我可以在运行时添加属性.这已经有效了.
def add_attr (cls, name, value):
setattr(cls, name, value)
class Unit(object):
pass
class Archer(Unit):
pass
myArcher = Archer()
add_attr(Unit, 'strength', 5)
print "Strenght ofmyarcher: " + str(myArcher.strength)
Unit.strength = 2
print "Strenght ofmyarcher: " + str(myArcher.strength)
Run Code Online (Sandbox Code Playgroud)
这导致了期望的输出:
肌肉的强度:5个
强度的肌肉:2
但是现在我不想预定义子类Archer,但我宁愿让用户决定如何调用这个子类.我尝试过这样的事情:
class Meta(type, subclassname):
def __new__(cls, subclassname, bases, dct):
return type.__new__(cls, subclassname, Unit, dct)
factory = Meta()
factory.__new__("Soldier")
Run Code Online (Sandbox Code Playgroud)
但没有运气.我想我还没有真正理解这里的新功能.我想要的结果是
class Soldier(Unit):
pass
Run Code Online (Sandbox Code Playgroud)
由工厂创建.如果我用"Knight"这个参数调用工厂,我会想要创建一个类Knight,Unit的子类.
有任何想法吗?提前谢谢了!
再见 -
萨诺
function ×3
objective-c ×2
bash ×1
boolean ×1
c ×1
class ×1
coding-style ×1
compile-time ×1
convention ×1
conventions ×1
delphi ×1
exit ×1
factory ×1
forms ×1
html ×1
input ×1
iterator ×1
javascript ×1
jquery ×1
logging ×1
metaclass ×1
procedure ×1
python ×1
r ×1
syntax ×1
variables ×1
xfce ×1