标签: weak-typing

静态/强类型和重构

在我看来,关于静态/强类型编程语言最有价值的是它有助于重构:如果/当你更改任何API时,编译器会告诉你这个更改已经破坏了什么.

我可以想象用运行时/弱类型语言编写代码......但是如果没有编译器的帮助我无法想象重构,我无法想象在没有重构的情况下编写成千上万行代码.

这是真的?

refactoring static-typing weak-typing strong-typing

6
推荐指数
2
解决办法
1249
查看次数

PHP串联字符串和算术运算

我不久前开始学习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)

输出中的最后两行不是我所期望的.

为什么是这样?这些表达式是如何评估的?我正在努力更好地理解这门语言.

php programming-languages weak-typing

6
推荐指数
1
解决办法
1083
查看次数

这种替代机制进行DBI查询有什么问题?

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 bind dbi weak-typing

5
推荐指数
2
解决办法
1473
查看次数

perl中的隐式转换

我是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,因为当数组转换为标量时,它应该是数组的最后一个元素.

perl weak-typing implicit-conversion

5
推荐指数
1
解决办法
455
查看次数

如果 Java 是强类型的,那么为什么这段代码可以编译呢?

我对强类型的理解是该语言不会进行隐式类型转换。但是,此代码将 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)

java types casting weak-typing strong-typing

5
推荐指数
1
解决办法
1万
查看次数

有没有办法禁用Typescript版本2.4引入的弱类型检测?

使用Typescript版本2.4添加了弱类型检测.现在我同意这是一个很棒的功能,当你为类型的可选属性没有单一属性匹配的类型分配值时,它将有助于捕获大量的错误.

不幸的是,对于最初用Javascript编写然后迁移到Typescript的大型项目,将会出现使用弱类型漏洞的情况.

为了能够轻松迁移到TS 2.4,然后逐步删除所有弱类型的攻击 - 是否有人知道标志或黑客暂时禁用弱类型检测?

types weak-typing typescript typescript2.4

5
推荐指数
1
解决办法
223
查看次数

Java - 为什么我不能部分键入变量?

为什么在使用现有变量键入新变量时输入全部或全部?

例如,假设我有一个data类型为的变量List<Map<String, ArrayList<String>>>,我想将其值传递给tempData.为什么在决定tempData我的类型时我是否仅限于ListList<Map<String, ArrayList<String>>>

如果我只想与某个"级别"进行交互data,比如Map级别,我该如何跳到那里?比如为什么我不能List<Map> tempData = data

我搜索过我的教科书和这个网站,但我无法找到解释原因的地方.如果我们被允许"部分打字",是否会出现问题?

我知道我可以强烈打字tempData,但我很好奇为什么Java有一个全有或全无的方法.

java weak-typing strong-typing

4
推荐指数
1
解决办法
154
查看次数

何时应该劝阻弱势群体?

何时应该劝阻弱势群体?在大型项目中,弱势类型是否会受到阻碍?如果左侧是强类型,如下所示,那将是规则的例外吗?

   int i = 5
   string sz = i
   sz = sz + "1"
   i  = sz
Run Code Online (Sandbox Code Playgroud)

是否有任何语言支持与上述类似的语法?告诉我更多关于弱相关类型和情况的利弊.

weak-typing

3
推荐指数
1
解决办法
1849
查看次数

尝试:: Tiny:使用try-catch或Not的奇怪行为?

我正在使用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)

输出序列对我来说是错误的.这是错的吗?或这是正常的行为吗?

perl cpan exception-handling try-catch weak-typing

3
推荐指数
1
解决办法
934
查看次数

常量1截断为整数?

为什么这个代码不会编译?

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不能被截断?它在谈论哪一个?

有人回答上面的代码没有编译因为bfloat64.但是为什么这会编译:

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.

types go weak-typing

3
推荐指数
1
解决办法
943
查看次数