在Ruby中,我如何以编程方式确定哪个类/模块定义了被调用的方法?
在我调用的给定范围内说some_method().在同一范围内,我想调用一个函数find_method(:some_method),将返回其类,单例类或模块定义some_method.
这里有一些代码来说明我的意思:
class Foo
include ...
def bar
...
some_method() # calls a method in scope, assume it exists
find_method(:some_method) # Returns where the method is defined
# e.g. => SomeClassOrModule
...
end
end
Run Code Online (Sandbox Code Playgroud)
我猜我不得不使用的反射功能,从复杂的混合物self,用self.ancestors走了继承树,使用method_defined?检查的方法在类或模块,并且可能是一些其他技巧来检查从范围界定最里面到最外层(因为代码可以在例如a内运行instance_eval).
我只是不知道正确的顺序和Ruby的元模型的所有细微之处来实现find_method,使得它在其搜索既详尽和正确的方法分派分辨率的观点.
谢谢!
我对android开发完全陌生,必须编写一个简单的应用程序来读取大学的nfc标签(带有nexus s)。
我的问题是,当 nexus 发现一个标签时,我的应用程序未列在“选择操作”-弹出窗口中。目的是使用前景调度方法读取标签,如http://developer.android.com/guide/topics/nfc/index.html 和 http://developer.android.com/resources/samples/ApiDemos 中所述/src/com/example/android/apis/nfc/ForegroundDispatch.html
我认为清单中缺少某些内容,但我不知道是什么。这是清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.iforge.android.nfc"
>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
>
<activity android:name=".simulator.FakeTagsActivity"
android:theme="@android:style/Theme.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="TagViewer"
android:theme="@android:style/Theme.NoTitleBar"
>
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<data android:mimeType="mime/type" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="10" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />
Run Code Online (Sandbox Code Playgroud)
这是在发现标签时应调用的活动代码(由 android NFCDemo 以及 ForegroundDispatch-example 构建):
public class TagViewer extends Activity …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我创建的对象定义"c"方法.
就像是
setMethod("c",
signature(...),
definition=function (...) {
myObject = list(...)[[1]]
myObject@mySlot=lapply(list(...), FUN = function(x) slot(x, "mySlot"))
return(myObject)
}
)
Run Code Online (Sandbox Code Playgroud)
问题是我无法定义...的类,以便正确完成调度.任何的想法?
dispatch_queue_t queueA; // assume we have this
dispatch_sync(queueA, ^(){ // (a)
dispatch_sync(queueA, ^(){ // (b)
foo();
});
});
Run Code Online (Sandbox Code Playgroud)
一旦我们点击了第二个dispatch_sync,我们就会死锁:我们无法调度到queueA,因为有人(当前线程)已经在该队列上并且永远不会离开它.
只要我明白
dispatch_sync只需添加工作项(我避免使用"块",因为它可能会混淆)到queueA,然后这个工作项将被发送到queueA的目标队列,然后GCD将为此工作项保留一个线程
threadWorkItem我已经阅读了很多与此相关的线程,比如使用dispatch_sync进行死锁,为什么我们不能在当前队列中使用dispatch_sync?,为什么这个dispatch_sync()调用冻结?,...但是找不到好的解释.有人说dispatch_sync阻止队列,有人说它阻止当前线程,...... :(
那为什么会导致僵局呢?
所以基本上我得到了这个套接字,它工作正常,向我发送“新订单”消息。
我正在使用 redux,我想分派一个动作,而不是减速器会得到它并且我的商店会被更新。但这段代码没有做任何事情!
socket.on('new order', (order) => {
return (dispatch) => {
dispatch(socketNewOrder(order));
}
});
Run Code Online (Sandbox Code Playgroud)
这是我的操作,它位于同一个文件中:
export const socketNewOrder = (order) => {
return {
type: 'SOCKET_NEW_ORDER',
payload: order
}
}
Run Code Online (Sandbox Code Playgroud)
我也试着这样称呼我的行动:
socket.on('new order', (order) => {
socketNewOrder(order));
});
Run Code Online (Sandbox Code Playgroud)
它确实调用了动作,但我的减速器没有“听到”动作!:(
我听说了一些关于使用中间件的消息,但我就是不知道如何去做。
谁能解释我如何在接收套接字消息时使用中间件来调度操作,以及为什么我的代码不起作用?感谢和抱歉新手问题
在 laravel 4 中,我可以使用 将闭包推送到队列上queue::push(function...),但这在 laravel 5 中不再有效。相反,我似乎必须为要推送到队列中的每个函数创建一个自定义 Job 类。
由于我想要推送的函数只有几行长,并且只在一个地方使用过,所以为每种情况编写一个完整的类似乎真的是浪费时间和空间。
我目前能想到的最好的“解决方案”是要么有一个辅助函数,它使用 PHP 的反射方法在调用时动态生成一个新类,要么有一个接受闭包作为参数的通用作业,即dispatch(new ClosureJob(function(){...}));
这些对我来说似乎不太理想。还有其他方法可以做到这一点吗?或者我必须实施其中之一吗?
我正在尝试用 C 制作一个基于宏的跳转表。
下面是一些示例代码:
#include "stdio.h"
#define GOTO(X) static void* caseArg[] = {&&I0, &&R0, &&S0, &&F0, &&G0, &&H0}; \
goto *caseArg[X];
#define FINISH() goto caseEnd;
int main(int argc, char** argv) {
GOTO(1);
I0: printf("in I0\n"); FINISH();
R0: printf("in R0\n"); FINISH();
S0: printf("in R0\n"); FINISH();
F0: printf("in R0\n"); FINISH();
G0: printf("in R0\n"); FINISH();
H0: printf("in R0\n"); FINISH();
caseEnd:;
}
Run Code Online (Sandbox Code Playgroud)
可能的标签(I0、R0 等)必须相同。
问题是:我希望能够在同一个源文件的不同范围内使用同一个宏。但是,编译器抱怨标签已定义。
我想要达到的目标:
int main(int argc, char** argv) {
{ // scope 1
GOTO(1);
I0: printf("in I0\n"); FINISH();
R0: printf("in …Run Code Online (Sandbox Code Playgroud) 我想为我所从事的项目内的用户创建一个 Redux 切片。我有这个代码沙箱fetchAll,我不知道为什么文件中的调用出现以下错误MyButton.tsx:
fetchAll(arg:any): AsyncThunkAction<未知,任意,{}>
预期有 1 个参数,但得到 0 个。
createAsyncThunk.d.ts(107, 118):未提供“arg”参数。
我在我从事的项目中有类似的代码,但它没有这个错误。我希望它能像在其他类似文件中一样工作。
沙箱中的相关文件:
import React from "react";
import { useDispatch } from "react-redux";
import { fetchAll } from "./redux/usersSlice";
export const MyButton = ({ children }: { children: any }) => {
const dispatch = useDispatch();
return (
<button
onClick={() => {
dispatch(fetchAll()); // I get an error on this fetchAll() call
}}
>
{children}
</button>
);
};
Run Code Online (Sandbox Code Playgroud)
export const fetchAll …Run Code Online (Sandbox Code Playgroud) Jon Gjengset在Rust for Rustaceans中指出(强调我的):
\n\n\n当您\xe2\x80\x99 在静态和动态调度之间进行选择时,\n很少有明确的正确答案。不过,从广义上讲,您\xe2\x80\x99ll\n希望在库中使用静态调度,在二进制文件中使用动态调度。在库中,您希望允许用户决定哪种类型的调度最适合他们,因为您不知道他们的需求是什么。如果您使用动态调度,它们\xe2\x80\x99将被迫执行相同的操作,而如果您使用\n静态调度,它们可以选择是否使用动态调度。”
\n
我对此的解释是:
\n在库中应该使用:fn execute(x: Arc<impl MyTrait>) -> ...这是静态调度。
在二进制文件中:let x: Arc<dyn MyTrait> = Arc::new(my_obj)这是动态的。
然后我想调用execute(x),但编译器抱怨:
error[E0277]: the size for values of type `dyn MyTrait` cannot be known at compilation time\n --> src/main.rs:12:13\n |\n12 | execute(x);\n | ------- ^ doesn\'t have a size known at compile-time\n | |\n | required by a bound introduced …Run Code Online (Sandbox Code Playgroud) 我想从Country()sto MenuButton()调度自定义事件;
CountryEvent
package {
import flash.events.Event;
public class CountryEvent extends Event {
public static const COUNTRY_HOVERED:String = "onCountryOver";
private var _countryName:String = "";
public function CountryEvent(type:String, countryName:String, bubbles:Boolean=true, cancelable:Boolean=false) {
super(type, bubbles, cancelable);
_countryName = countryName;
}
public function get countryName():String {
return _countryName;
}
public override function clone():Event
{
return new CountryEvent(type,countryName,bubbles,cancelable);
}
}
Run Code Online (Sandbox Code Playgroud)
} 国家类
package
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;
public class Country extends MovieClip
{
private var countryEvent:CountryEvent;
public function Country()
{
this.addEventListener(MouseEvent.MOUSE_OVER,onMouseOver); …Run Code Online (Sandbox Code Playgroud)