我正在编写一个通过JNI接口使用C++库的Java应用程序.C++库创建了类型的对象Foo,这些对象通过JNI传递给Java.
假设库具有输出功能
void Foo::print(std::ostream &os)
Run Code Online (Sandbox Code Playgroud)
我有一个Java OutputStream out.如何Foo::print从Java 调用以便输出显示out?有什么办法来要挟OutputStream到std::ostream在JNI层?我可以在缓冲区中捕获JNI层的输出,然后将其复制到out?
以下代码是生成Bar<T>给定a 的工厂示例Foo<T>.工厂并不关心什么T是:对于任何类型T,它都可以制造Bar<T>一个Foo<T>.
import com.google.inject.*;
import com.google.inject.assistedinject.*;
class Foo<T> {
public void flip(T x) { System.out.println("flip: " + x); }
}
interface Bar<T> {
void flipflop(T x);
}
class BarImpl<T> implements Bar<T> {
Foo<T> foo;
@Inject
BarImpl(Foo<T> foo) { this.foo = foo; }
public void flipflop(T x) { foo.flip(x); System.out.println("flop: " + x); }
}
interface BarFactory {
<T> Bar<T> create(Foo<T> f);
}
class Module extends AbstractModule {
public …Run Code Online (Sandbox Code Playgroud) 我的SVN存储库中有第三方库,我想在Eclipse中本地关联source/javadoc.即,应该有一些本地设置(例如,local.properties文件中的条目)将源/ javadoc与JAR文件相关联,但是不会通过本地依赖项将本地依赖项引入存储库.classpath.理想情况下,我有
lib_src_dir = /my/path/to/lib/src
Run Code Online (Sandbox Code Playgroud)
在local.properties再
<classpathentry kind="lib" path="lib.jar" sourcepath="${lib_src_dir}">
Run Code Online (Sandbox Code Playgroud)
在.classpath.可以这样做吗?
[编辑] @VonC的回答是有帮助的......有没有办法从文本文件加载路径变量(例如local.properties),而不是通过Window - > Preferences - > General - > Workspace - > Linked Resources?
我很有诱惑力使用未经检查的异常作为Java程序中的短路控制流构造.我希望有人能以更好,更清洁的方式告诉我这个问题.
我的想法是,我希望减少访问者对子树的递归探索,而不必在每个方法调用中检查"停止"标志.具体来说,我正在使用抽象语法树上的访问者构建控制流图.returnAST中的语句应该停止对子树的探索,并将访问者发送回最近的封闭if/then或循环块.
的Visitor超类(从XTC库)定义
Object dispatch(Node n)
Run Code Online (Sandbox Code Playgroud)
通过表单的反射方法回调
Object visitNodeSubtype(Node n)
Run Code Online (Sandbox Code Playgroud)
dispatch 没有声明抛出任何异常,所以我声明了一个扩展的私有类 RuntimeException
private static class ReturnException extends RuntimeException {
}
Run Code Online (Sandbox Code Playgroud)
现在,return语句的visitor方法看起来像
Object visitReturnStatement(Node n) {
// handle return value assignment...
// add flow edge to exit node...
throw new ReturnException();
}
Run Code Online (Sandbox Code Playgroud)
并且每个复合语句都需要处理 ReturnException
Object visitIfElseStatement(Node n) {
Node test = n.getChild(0);
Node ifPart = n.getChild(1);
Node elsePart = n.getChild(2);
// add flow edges to if/else...
try{ dispatch(ifPart); } catch( ReturnException e ) { …Run Code Online (Sandbox Code Playgroud) Prelude功能的类型flip是:
flip :: (a -> b -> c) -> b -> a -> c
Run Code Online (Sandbox Code Playgroud)
即,它需要一个二进制函数和两个参数.
Prelude功能的类型id是:
id :: a -> a
Run Code Online (Sandbox Code Playgroud)
但是类型flip id是:
flip id :: a -> (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)
这怎么可能应用flip到id的时候id是一个一元函数,并flip要求对第一个参数二元函数?
顺便说一句.flip id类似于\ x f -> f x
我想在文件中找到与t [A-Z]u形式的正则表达式匹配的任何文本(即匹配t后跟大写字母和另一个匹配u,并转换匹配的文本以使大写字母为小写.例如,为正则表达式x[A-Z]y
xAy
Run Code Online (Sandbox Code Playgroud)
变
xay
Run Code Online (Sandbox Code Playgroud)
和
xZy
Run Code Online (Sandbox Code Playgroud)
变
xzy
Run Code Online (Sandbox Code Playgroud)
Emacs的query-replace功能允许反向引用,但AFAIK不是匹配文本的转换.是否有内置功能可以做到这一点?有没有人有我可以使用的简短Elisp功能?
UPDATE
@Marcel Levy有它:\,在替换表达式中引入了(任意?)Elisp表达式.例如,上面的解决方案是
M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase \1)z
Run Code Online (Sandbox Code Playgroud) 是否有一个更简洁/标准的习惯用法(例如,JDK方法)用于"管道"输入到Java中的输出而不是以下?
public void pipe(Reader in, Writer out) {
CharBuffer buf = CharBuffer.allocate(DEFAULT_BUFFER_SIZE);
while (in.read(buf) >= 0 ) {
out.append(buf.flip());
buf.clear();
}
}
Run Code Online (Sandbox Code Playgroud)
[编辑]请注意,Reader和Writer被给予.正确答案将演示如何获取in和out形成管道(最好不超过1或2个方法调用).我将接受答案,其中in和out是InputStream和OutputStream(最好是从/到Reader/ 的转换Writer).我不会接受的答案无论是地方in还是out是一个子类的Reader/ InputStream或Writer/ OutputStrem.
假设我使用的是具有泛型类型参数的接口
interface Foo<T> {
T getOne();
void useOne(T t);
}
Run Code Online (Sandbox Code Playgroud)
意图是类型T是抽象的:它对实现强制执行类型约束Foo,但客户端代码并不关心究竟是什么T.
这在通用方法的上下文中没有问题:
public <T> void doStuff(Foo<T> foo) {
T t = foo.getOne();
/* do stuff */
foo.useOne(t);
}
Run Code Online (Sandbox Code Playgroud)
但是假设我想要分解工作doStuff,在课堂上保存一些状态Bar.在这种情况下,我似乎需要添加的类型参数Foo来Bar.
public class Bar<T> {
private Foo<T> foo;
private T t;
/* ... */
public void startStuff() {
t = foo.getOne();
}
public void finishStuff() {
foo.useOne(t);
}
}
Run Code Online (Sandbox Code Playgroud)
这有点奇怪,因为类型参数T没有出现在公共接口中Bar(即,它不包含在任何方法参数或返回类型中).有没有办法"量化T"?即,我可以安排将参数T隐藏在界面中 …
什么是Java最好的漂亮打印库?我的意思是一个用于打印带缩进,中断提示等格式化输出的库,而不是用于美化/重新格式化Java代码本身的库.理想情况下,图书馆会System.out.println与朋友"玩得很开心" .
有关我正在寻找的内容的概念,请参阅OCaml的Format模块,尤其是Format.fprintf.
[更新]我不是在寻找控制台窗口库.漂亮的打印库允许您定义格式化任意值的方法,以便保留缩进并在合理的位置选择换行符.这些库存在于Haskell,Standard ML,OCaml,F#和Scheme中.该XTC库提供了一些此功能的xtc.tree.Printer,但它并不像在其他语言库一样灵活.
这里发生了什么?
printf.sh:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME
Run Code Online (Sandbox Code Playgroud)
命令行会话:
$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush
Run Code Online (Sandbox Code Playgroud)
更新:printf "Hello, %s\n" "$NAME"有效.为什么我没有使用echo,请考虑
echo.sh:
#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"
Run Code Online (Sandbox Code Playgroud)
命令行:
$ ./echo.sh
Filename: C: mp
Run Code Online (Sandbox Code Playgroud)
该POSIX规范的echo说,"我们鼓励新的应用程序使用printf,而不是echo"(这和其他原因).