我正在使用node.js v4.3.1
我想在调用函数时使用命名参数,因为它们更具可读性.
在python中,我可以用这种方式调用函数;
info(spacing=15, width=46)
Run Code Online (Sandbox Code Playgroud)
我如何在node.js中做同样的事情?
我的javascript函数看起来像这样;
function info(spacing, width)
{
//implementation
{
Run Code Online (Sandbox Code Playgroud) 我一直在为Windows开发一个GUI库(作为个人辅助项目,没有实用性的愿望).对于我的主窗口类,我已经设置了一个选项类的层次结构(使用命名参数成语),因为一些选项是共享的,而其他选项是特定于特定类型的窗口(如对话框).
命名参数Idiom的工作方式,参数类的函数必须返回它们被调用的对象.问题是,在层次结构中,每个都必须是一个不同的类 - createWindowOpts标准窗口的createDialogOpts类,对话框的类等.我通过制作所有选项类模板来解决这个问题.这是一个例子:
template <class T>
class _sharedWindowOpts: public detail::_baseCreateWindowOpts {
public: ///////////////////////////////////////////////////////////////
// No required parameters in this case.
_sharedWindowOpts() { };
typedef T optType;
// Commonly used options
optType& at(int x, int y) { mX=x; mY=y; return static_cast<optType&>(*this); }; // Where to put the upper-left corner of the window; if not specified, the system sets it to a default position
optType& at(int x, int y, int width, int height) { …Run Code Online (Sandbox Code Playgroud) 许多函数式编程语言都支持curried参数.为了支持currying函数,函数的参数本质上是一个元组,其中可以省略最后一个参数,从而使新函数需要更小的元组.
我正在考虑设计一种总是使用记录(也就是命名参数)作为函数参数的语言.
因此,我的make中的简单数学函数相信语言将是:
add { left : num, right : num } = ...
minus { left : num, right : num } = ..
Run Code Online (Sandbox Code Playgroud)
您可以将任何记录传递给这些函数,只要它们具有这两个命名参数(它们可以有更多只是"左"和"右").
如果它们只有一个命名参数,则会创建一个新函数:
minus5 :: { left : num } -> num
minus5 = minus { right : 5 }
Run Code Online (Sandbox Code Playgroud)
我借用了一些haskell的表示法.
有没有人看过这样做的语言?
programming-languages functional-programming language-design currying named-parameters
当我使用Scala-2.8中添加的自动生成的copy()方法时,我遇到了一些奇怪的行为.
从我读过的内容来看,当你将一个给定的类声明为一个case-class时,你会自动生成很多东西,其中一个就是copy()方法.所以你可以做以下......
case class Number(value: Int)
val m = Number(6)
println(m) // prints 6
println( m.copy(value=7) ) // works fine, prints 7
println( m.copy(value=-7) ) // produces: error: not found: value value
println( m.copy(value=(-7)) ) // works fine, prints -7
Run Code Online (Sandbox Code Playgroud)
如果已经问过这个问题,我很抱歉,但这里发生了什么?
我尝试使用奇怪的重复模板模式(CRTP)并提供其他类型参数:
template <typename Subclass, typename Int, typename Float>
class Base {
Int *i;
Float *f;
};
...
class A : public Base<A, double, int> {
};
Run Code Online (Sandbox Code Playgroud)
这可能是一个错误,更合适的超类Base<A, double, int>- 尽管这个参数顺序不匹配并不是那么明显.如果我可以在typedef中使用name的含义,那么这个bug会更容易看到:
template <typename Subclass>
class Base {
typename Subclass::Int_t *i; // error: invalid use of incomplete type ‘class A’
typename Subclass::Float_t *f;
};
class A : public Base<A> {
typedef double Int_t; // error: forward declaration of ‘class A’
typedef int Double_t;
};
Run Code Online (Sandbox Code Playgroud)
但是,这不能在gcc 4.4上编译,报告的错误是作为上面的注释给出的 - 我认为原因是在创建A之前,它需要实例化Base模板,但这又需要知道A.
使用CRTP时是否有传递"命名"模板参数的好方法?
我设计了一个参数类,允许我编写如下代码:
//define parameter
typedef basic_config_param<std::string> name;
void test(config_param param) {
if(param.has<name>()) { //by name
cout << "Your name is: " << param.get<name>() << endl;
}
unsigned long & n = param<ref<unsigned long> >(); //by type
if(param.get<value<bool> >(true)) { //return true if not found
++n;
}
}
unsigned long num = 0;
test(( name("Special :-)"), ref<unsigned long>(num) )); //easy to add a number parameter
cout << "Number is: " << num; //prints 1
Run Code Online (Sandbox Code Playgroud)
类的性能非常快:一切都只是堆栈的引用.为了保存所有信息,我在使用最多5个参数的内部缓冲区进行堆分配之前减少每个对象的大小,但这很容易改变.
为什么这种语法不经常使用,重载operator,()以实现命名参数?是因为潜在的性能损失?
另一种方法是使用命名的习语:
object.name("my name").ref(num); //every …Run Code Online (Sandbox Code Playgroud) 试图了解Ocaml的命名参数机制.我理解基础知识,但文档显示了这样的示例:
# let f ~x ~y = x - y;;
val f : x:int -> y:int -> int = <fun>
# let x = 3 and y = 2 in f ~x ~y;;
- : int = 1
Run Code Online (Sandbox Code Playgroud)
在应用中仅使用波浪号时究竟发生了什么?它只是简写~x:x,类似于定义吗?如果是这样,有人可以解释为什么这样:
# ListLabels.fold_left;;
- : f:('a -> 'b -> 'a) -> init:'a -> 'b list -> 'a = <fun>
# let add = (+) and i = 0
in ListLabels.fold_left ~add ~i [1;2;3];;
Run Code Online (Sandbox Code Playgroud)
产生
- : f:((add:(int -> …Run Code Online (Sandbox Code Playgroud) 根据我对支持该功能的语言的体验,使用命名参数而不是位置参数调用函数的程序更易于阅读和维护.
我认为Perl有这个功能,但它不适合我.
这是我正在使用的包裹的怪癖,还是我做错了?
我的第一个Perl项目是使用HTML :: TableExtract包从HTML标记中提取表数据并将其显示为文本.
以下代码设置解析器:
use strict;
use warnings;
use HTML::TableExtract;
my $markup = <<MARKUP;
<table>
<tr> <th>a</th> <th>b</th> <th>c</th> </tr>
<tr> <td>1</td> <td>2</td> <td>3</td> </tr>
<tr> <td>4</td> <td>5</td> <td>6</td> </tr>
</table>
MARKUP
my $parser = HTML::TableExtract->new() ;
$parser->parse($markup) ;
Run Code Online (Sandbox Code Playgroud)
该文件说,我可以使用输出转储到命令提示符tables_dump方法和使用参数$show_content和$col_sep控制输出格式:
tables_report([$show_content, $col_sep])返回一个字符串,汇总提取的表格及其深度和计数.可选择使用$ show_content标志,该标志将转储每个表的提取内容以及由$ col_sep分隔的列.默认$ col_sep是':'.
tables_dump([$show_content, $col_sep])与tables_report()相同,但将信息转储到STDOUT.
如果我按文档顺序传递位置参数,我得到我期望的输出:
$parser->tables_dump(1, '_') ;
Run Code Online (Sandbox Code Playgroud)
列由下划线而不是默认冒号分隔:
TABLE(0, 0):
a_b_c
1_2_3
4_5_6
Run Code Online (Sandbox Code Playgroud)
在Perl.com的高级子例程文章之后,我尝试传递包含参数名称和值的哈希,以阐明参数的含义:
$parser->tables_dump({show_content => 1, col_sep => …Run Code Online (Sandbox Code Playgroud) 说有方法,
void M(int a, int b, int c /* and many more */)
Run Code Online (Sandbox Code Playgroud)
有没有办法转换M()到M(a: .., b: .., c: ..)呼叫站点?
我正在使用Visual Studio 2013(终极) 2017专业版 ReSharper 8ReSharper 2018.1.使用其中任何一种的内置解决方案(或者如果需要这样的扩展)都是合适的.
这类似于是否有任何工具可以帮助我重构方法调用从使用基于位置的参数到基于名称的参数,尽管我希望从没有参数开始; 并在4年后问这个问题.
假设我想选择记录在哪里Id = 30.准备语句允许两种绑定参数的方式:
问号
$id = 30;
$q = $conn->prepare("SELECT * FROM pdo_db WHERE id > ?");
$q->execute(array($id)); // Here above ID will be passed
Run Code Online (Sandbox Code Playgroud)
命名参数
$sth = $conn->prepare("SELECT `id`, `title` FROM `pdo_db` WHERE `id` > :id");
$sth->execute(array(
':id' => 30
));
Run Code Online (Sandbox Code Playgroud)
两者都工作正常,并给出准确的结果,但我无法得到这两者之间的确切差异,也不能在我应该使用其中一个?