在我看来,关于静态/强类型编程语言最有价值的是它有助于重构:如果/当你更改任何API时,编译器会告诉你这个更改已经破坏了什么.
我可以想象用运行时/弱类型语言编写代码......但是如果没有编译器的帮助我无法想象重构,我无法想象在没有重构的情况下编写成千上万行代码.
这是真的?
我不久前开始学习PHP,我遇到了这个问题:
<?php
$a = 1;
$b = 2;
echo "$a * $b = " . $a * $b;
echo "<br />";
echo "$a / $b = " . $a / $b;
echo "<br />";
echo "$a + $b = " . $a + $b;
echo "<br />";
echo "$a - $b = " . $a - $b;
echo "<br />";
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
1 * 2 = 2
1 / 2 = 0.5
3
-1
Run Code Online (Sandbox Code Playgroud)
输出中的最后两行不是我所期望的.
为什么是这样?这些表达式是如何评估的?我正在努力更好地理解这门语言.
在DBI文档中,这是多次执行查询的推荐代码:
$sth = $dbh->prepare_cached($statement);
$sth->execute(@bind);
$data = $sth->fetchall_arrayref(@attrs);
$sth->finish;
Run Code Online (Sandbox Code Playgroud)
但是,我看到许多*查询方法允许传递一个准备好的和缓存的语句句柄来代替查询字符串,这使得这成为可能:
$sth = $dbh->prepare_cached($statement);
$data = $dbh->selectall_arrayref($sth, \%attrs, @bind);
Run Code Online (Sandbox Code Playgroud)
这种方法有什么问题吗?我还没有看到它在野外使用过.
FWIW,我对这两个实现进行了基准测试.第二种方法fetchall_arrayref在第一次实现selectall_arrayref中使用第二次执行时查询连续两行时,速度略微提高(4%).
*支持此功能的查询方法的完整列表如下:
- selectrow_arrayref - 使用预准备语句的常规方法是fetchrow_arrayref
- selectrow_hashref - ""fetchrow_hashref
- selectall_arrayref - ""fetchall_arrayref
- selectall_hashref - ""fetchall_hashref
- selectcol_arrayref(实际上没有计数,因为它没有使用第一个代码路径的并行方法,如上所述 - 所以使用这个方法的预准备语句的唯一方法是使用上面的第二个代码路径)
我是Perl的新手,请有人为我解释以下脚本:
#!/usr/bin/env perl
use strict;
use warnings;
sub f1($) { my ($v) = @_; print "f1 $v\n"; }
sub f2(@) { my ($v) = @_; print "f2 $v\n"; }
my $s = "ww";
my @a = ("xx", "yy", "zz");
f1 $s; f1 @a; f2 $s; f2 @a;
Run Code Online (Sandbox Code Playgroud)
我的电脑输出是:
f1 ww
f1 3
f2 ww
f2 xx # why!!
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么第四个输出是xx?我认为它应该是zz,因为当数组转换为标量时,它应该是数组的最后一个元素.
我对强类型的理解是该语言不会进行隐式类型转换。但是,此代码将 char 转换为其 ascii 值,然后使用该值。
static char x = 'j';
static int y = 7;
public static void main(String[] args){
System.out.println(y+x);
}
Run Code Online (Sandbox Code Playgroud) 使用Typescript版本2.4添加了弱类型检测.现在我同意这是一个很棒的功能,当你为类型的可选属性没有单一属性匹配的类型分配值时,它将有助于捕获大量的错误.
不幸的是,对于最初用Javascript编写然后迁移到Typescript的大型项目,将会出现使用弱类型漏洞的情况.
为了能够轻松迁移到TS 2.4,然后逐步删除所有弱类型的攻击 - 是否有人知道标志或黑客暂时禁用弱类型检测?
为什么在使用现有变量键入新变量时输入全部或全部?
例如,假设我有一个data类型为的变量List<Map<String, ArrayList<String>>>,我想将其值传递给tempData.为什么在决定tempData我的类型时我是否仅限于List或List<Map<String, ArrayList<String>>>?
如果我只想与某个"级别"进行交互data,比如Map级别,我该如何跳到那里?比如为什么我不能List<Map> tempData = data?
我搜索过我的教科书和这个网站,但我无法找到解释原因的地方.如果我们被允许"部分打字",是否会出现问题?
我知道我可以强烈打字tempData,但我很好奇为什么Java有一个全有或全无的方法.
何时应该劝阻弱势群体?在大型项目中,弱势类型是否会受到阻碍?如果左侧是强类型,如下所示,那将是规则的例外吗?
int i = 5
string sz = i
sz = sz + "1"
i = sz
Run Code Online (Sandbox Code Playgroud)
是否有任何语言支持与上述类似的语法?告诉我更多关于弱相关类型和情况的利弊.
我正在使用Try::Tinytry-catch.
代码如下:
use Try::Tiny;
try {
print "In try";
wrongsubroutine(); # undefined subroutine
}
catch {
print "In catch";
}
somefunction();
Run Code Online (Sandbox Code Playgroud)
...
sub somefunction {
print "somefunction";
}
Run Code Online (Sandbox Code Playgroud)
当我执行时它是这样的:
somefunction
In Try
In catch
Run Code Online (Sandbox Code Playgroud)
输出序列对我来说是错误的.这是错的吗?或这是正常的行为吗?
为什么这个代码不会编译?
package main
const a = 1.000001
const base = 0
const b = a+base
func main() {
f(b)
}
func f(int) {}
Run Code Online (Sandbox Code Playgroud)
$ go run a.go
# command-line-arguments
./a.go:4: constant 1 truncated to integer
Run Code Online (Sandbox Code Playgroud)
这是说1被截断了?或者1不能被截断?它在谈论哪一个?
有人回答上面的代码没有编译因为b是float64.但是为什么这会编译:
package main
import "fmt"
const a = 1.000001
const b = a-0.000001
func main() {
fmt.Printf("%T %v\n",a,a)
fmt.Printf("%T %v\n",b,b)
f(b)
}
func f(int) {}
Run Code Online (Sandbox Code Playgroud)
$ go run a.go
float64 1.000001
float64 1
Run Code Online (Sandbox Code Playgroud)
?b是一个float64在这里,但它可以传递给f.
weak-typing ×10
perl ×3
types ×3
java ×2
bind ×1
casting ×1
cpan ×1
dbi ×1
go ×1
php ×1
refactoring ×1
try-catch ×1
typescript ×1