为什么函数toUriInner不输出scheme
时间: 2024-05-13 08:18:09 浏览: 13
函数toUriInner是将一个URI对象转换成字符串表示的内部函数。它可能没有输出scheme是因为URI对象的scheme属性为空,或者在实现函数时忘记了输出scheme。如果URI对象的scheme属性为空,那么toUriInner函数不会输出scheme。如果你想要输出scheme,可以在实现函数时增加相关代码,例如:
```java
private String toUriInner(URI uri) {
StringBuilder sb = new StringBuilder();
if (uri.getScheme() != null) {
sb.append(uri.getScheme()).append(":");
}
// 其他代码
return sb.toString();
}
```
这样实现后,当URI对象的scheme属性不为空时,函数就会输出scheme。
相关问题
Android toUriInner()中生成的uri为什么不包含参数scheme
Android中的Uri类表示一个URI(Uniform Resource Identifier),包括URL和URN。Uri的scheme部分就是URI的协议部分,比如http、https、ftp等。
在Android中,Uri的toUriInner()方法是用于将Uri对象转换为字符串形式的方法。该方法会将Uri对象的各个部分拼接成一个字符串,但是不会包含scheme部分,因为scheme部分已经在URI的构造函数中被指定了。
例如,以下代码创建一个包含scheme部分为http的Uri对象:
```
Uri uri = Uri.parse("http://www.example.com");
```
调用toUriInner()方法生成的字符串为:
```
// 输出结果为:www.example.com
String uriString = uri.toUriInner();
```
可以看到,生成的字符串只包含了主机名,而没有包含scheme部分。
如果需要获取包含scheme部分的URI字符串,可以直接调用Uri对象的toString()方法:
```
// 输出结果为:http://www.example.com
String uriStringWithScheme = uri.toString();
```
scheme中delay函数和force函数
`delay`函数和`force`函数是Scheme中用于实现惰性求值的基本工具。
`delay`函数的作用是将一个表达式转换为一个promise(承诺),即一个延迟计算的对象。具体来说,`delay`函数接受一个表达式作为参数,返回一个promise对象。这个表达式不会立即求值,而是在第一次调用`force`函数时才会被求值。
例如,下面的代码定义了一个延迟计算的表达式:
```
(define p (delay (+ 1 2)))
```
这个表达式并没有被求值,而是被封装到一个promise对象中。要获取这个表达式的值,需要调用`force`函数:
```
(force p) ; => 3
```
`force`函数的作用是强制求值一个promise对象。具体来说,`force`函数接受一个promise对象作为参数,返回这个promise对象所代表的表达式的值。
需要注意的是,一个promise对象只会被求值一次。也就是说,如果一个promise对象已经被求值过了,再次调用`force`函数只会返回上次求值的结果,而不会重新求值。
例如,下面的代码定义了一个延迟计算的表达式,它只会被求值一次:
```
(define count (let ((i 0))
(lambda () (begin (set! i (+ i 1)) i))))
(define p (delay (count)))
(force p) ; => 1
(force p) ; => 1
(force p) ; => 1
```
在这个例子中,`count`是一个闭包,它会返回一个递增的数字。`p`是一个延迟计算的表达式,它每次被求值时都会调用`count`函数,获取一个递增的数字。由于`p`只会被求值一次,所以无论调用多少次`force`函数,都只会返回1。